ECMAScript 2017 中的 Object.is 与 === 的区别
在 JavaScript 中,判断两个值是否相等是常常需要解决的问题。而在 ECMAScript 2017 中,新引入了一个方法 Object.is() 来进行值的比较,那么它与原生的 === 操作符有什么区别呢?
=== 是严格相等运算符,用来判断两个值是否完全相等,即类型和值都相等,比较结果是布尔值 true 或 false。而 Object.is() 则是基于 SameValue 原则进行比较,用来判断两个值是否相等,比较结果是布尔值 true 或 false。
但是,SameValue 原则与严格相等运算符的行为类似,但存在一些细微的差别。下面来看一下 Object.is() 和 === 在比较不同类型的值时的行为:
- 比较数字
Object.is(1, 1); // true Object.is(NaN, NaN); // true Object.is(0, -0); // false 1 === 1; // true NaN === NaN; // false 0 === -0; // true
可以看到,Object.is() 在比较 NaN 和 NaN 时返回 true,而 === 返回 false;在比较 0 和 -0 时,Object.is() 返回 false,而 === 返回 true。
这是因为,NaN 在 JavaScript 中被认为不等于任何值,包括它本身。而对于正负 0 来说,它们在数值上是相等的,但有着不同的符号,而 Object.is() 会将它们视为不相等的值。
- 比较字符串
Object.is('foo', 'foo'); // true 'foo' === 'foo'; // true
无论是 Object.is() 还是 ===,它们在比较字符串时都只考虑值相等,不会考虑大小写或位置。
- 比较布尔值
Object.is(true, true); // true Object.is(false, false); // true true === true; // true false === false; // true
在比较布尔值时,Object.is() 和 === 的行为是一致的,都只考虑值相等。
- 比较对象
const obj1 = { foo: 'bar' }; const obj2 = { foo: 'bar' }; Object.is(obj1, obj1); // true Object.is(obj1, obj2); // false obj1 === obj1; // true obj1 === obj2; // false
在比较对象时,Object.is() 和 === 会比较它们在内存中所处的位置,而不是它们的属性是否完全相等。只有当两个对象的引用指向同一个位置时,Object.is() 才会返回 true,而 === 也是如此。
结论
通过以上分析可以看出,Object.is() 和 === 在很多情况下的行为类似,但在比较 NaN 和正负 0 时会有所不同。另外,Object.is() 比较对象时不考虑属性是否相等,而是比较它们在内存中的位置。
因此,在比较两个值时,要根据具体的情况选择使用 === 还是 Object.is()。如果需要比较所有类型的值,包括 NaN 和正负 0,可以使用 Object.is(),否则建议还是使用 === 进行比较。
示例代码
-- -------------------- ---- ------- ----- ---- - - ---- ----- -- ----- ---- - - ---- ----- -- ----- ---- - --- -- --- ----- ---- - --- -- --- ------------------------ ---- -- ---- -------------------------- ------ -- ---- ------------------------ ----- -- ----- ---------------------------- -------- -- ---- --------------------------- ------- -- ---- ---------------------------- -------- -- ---- --------------------------- ------- -- ---- --------------------------- ------- -- ----- --------------------------- ------- -- ---- --------------------------- ------- -- ----- ------------- --- --- -- ---- --------------- --- ----- -- ----- ------------- --- ---- -- ---- ----------------- --- ------- -- ---- ---------------- --- ------ -- ---- ----------------- --- ------- -- ---- ---------------- --- ------ -- ---- ---------------- --- ------ -- ----- ---------------- --- ------ -- ---- ---------------- --- ------ -- -----
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670ce9d75f551281025c0013