Object.is() vs. JavaScript中的strict equality operator介绍

825 阅读2分钟

三重平等运算符=== ,严格检查两个值是否相同。

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() 作为一种比较数值的功能方式也很有用,例如在函数式编程中。