三重平等运算符=== ,严格检查两个值是否相同。
1 === 1; // => true
1 === '1'; // => false
1 === true; // => false
然而,ES2015规范带来了Object.is() ,它的行为方式几乎与严格的平等运算符相同。
Object.is(1, 1); // => true
Object.is(1, '1'); // => false
Object.is(1, true); // => false
主要问题是:什么时候你会使用Object.is()而不是严格的平等检查?让我们来了解一下。
1.严格的平等检查操作符
首先,让我们快速回顾一下严格平等运算符的工作原理。
当两个值的类型相同且持有相同的值时,严格的平等检查运算符的评估结果为true 。
例如,下面的初值是相等的,因为它们是相同的类型并且拥有相同的值。
1 === 1; // => true
'abc' === 'abc'; // => true
true === true; // => true
null === null; // => true
undefined === undefined; // => true
严格的平等运算符不执行运算符的类型反转。即使运算符持有合理的相同值,但尽管如此,它们的类型不同,它们也不是严格相等的。
1 === '1'; // => false
1 === true; // => false
null === undefined; // => false
当对对象进行严格的相等检查时,一个对象只与它自己严格相等。
const myObject = { prop: 'Value' };
myObject === myObject; // => true
即使2个对象具有完全相同的属性和值,它们也是不同的值。
const myObject1 = { prop: 'Value' };
const myObject2 = { prop: 'Value' };
myObject1 === myObject2; // => false
上述比较情况在Object.is(valueA, valueB) 中的作用完全相同。
严格平等检查和Object.is() 的区别在于如何处理NaN 和负零-0 。
首先,NaN (Not A Number)并不严格等于任何其他值,即使与另一个NaN 。
NaN === NaN; // => false
NaN === 1; // => false
其次,严格平等运算符并不区分-0 和+0 。
-0 === +0; // => true
严格的平等运算符使用严格的平等比较算法。
2.2. Object.is()
Object.is(valueA, valueB) 检查参数是否相等的方式与严格平等运算符相同,但有两个区别。
首先,NaN 等于另一个NaN 值。
Object.is(NaN, NaN); // => true
Object.is(NaN, 1); // => false
其次,Object.is() 区分了-0 和+0 。
Object.is(-0, +0); // => false
Object.is(),与严格的平等运算符相比,使用相同值比较算法。
3.3.总结
在大多数情况下,严格平等运算符是比较数值的好方法。
如果你想直接检查NaN ,或者对负数和正数的零进行更严格的区分,那么Object.is() 是一个不错的选择。
另外,Object.is() 作为一种比较数值的功能方式也很有用,例如在函数式编程中。