三重相等运算符===严格检查2个值是否相同:1===1;//=>true1==='1';//=>false1===true;//=>false但是,ES2015规范引入了Object.is(),其行为几乎与严格相等运算符相同:Object.is(1,1);//=>trueObject.is(1,'1');//=>falseObject.is(1,true);//=>false主要问题是:什么时候使用Object.is()而不是严格的相等检查?让我们找出答案。1.严格相等运算符首先,让我们快速回顾一下严格相等运算符是如何工作的。当两个值属于同一类型并持有相同的值时,严格相等检查运算符的计算结果为真。例如下面的原始值是相等的,因为它们是相同的类型并且具有相同的值:1===1;//=>true'abc'==='abc';//=>truetrue===true;//=>truenull===null;//=>trueundefined===undefined;//=>true严格相等运算符不执行类型强制,即使运算符持有合理相同的值,但类型不同运算符,它们不严格相等:1==='1';//=>false1===true;//=>falsenull===undefined;//=>false对对象执行严格相等检查时,一个object只严格等于它自己:constmyObject={prop:'Value'};myObject===myObject;//=>true尽管2个对象具有完全相同的属性和值,但它们具有不同的值:constmyObject1={prop:'Value'};constmyObject2={prop:'Value'};myObject1===myObject2;//=>false上述比较方案在Object.is(valueA,valueB)中的工作方式完全相同。严格相等检查和Object.is()之间的区别在于处理NaN和处理负零-0的方式。首先,NaN(非数字)不严格等于任何其他值,即使是另一个NaN:NaN===NaN;//=>falseNaN===1;//=>false其次,严格相等运算符不能组合-0与+0的区别:-0===+0;//=>true严格相等运算符使用严格相等比较算法。http://www.ecma-international.org/ecma-262/7.0/index.html#sec-strict-equality-comparison2。Object.is()Object.is(valueA,valueB)与检查参数相等性的严格相等运算符方式相同,但有两个区别。一、NaN等于另一个NaN值:Object.is(NaN,NaN);//=>trueObject.is(NaN,1);//=>false二、Object.is()区分-0和+0:Object.is(-0,+0);//=>false与严格相等运算符相比,Object.is()使用相同的值比较算法。http://www.ecma-international.org/ecma-262/7.0/index.html#sec-samevalue总结在大多数情况下,严格相等运算符是比较值的好方法。如果您想直接检查NaN值或对负零和正零进行更严格的区分,Object.is()是一个不错的选择。Object.is()也可用作比较值的函数式方法,例如在函数式编程中。
