本文深入解析JavaScript中Object.is()与===运算符的区别。虽然两者行为高度相似,但Object.is()能正确识别NaN等于NaN,并区分-0与+0。文章通过代码示例对比了两种比较方式在原始值、对象引用及特殊数值处理上的差异,帮助开发者根据场景选择最合适的比较方法。
JavaScript Object.is()与===运算符区别详解:NaN与-0处理
三重相等运算符 === 用于严格检查两个值是否完全相同:
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
即使两个对象的属性和值完全一致,它们的比较结果依然不同:
const myObject1 = { prop: 'Value' };
const myObject2 = { prop: 'Value' };
myObject1 === myObject2; // => false
上述比较场景在 Object.is(valueA,valueB) 中的表现完全相同。
严格相等检查和 Object.is() 的主要区别在于对 NaN 和负零 -0 的处理方式。
首先,NaN(非数字)并不严格等于任何其他值,包括另一个 NaN:
NaN === NaN; // => false
NaN === 1; // => false
其次,严格相等运算符无法区分 -0 与 +0:
-0 === +0; // => true
严格相等运算符采用严格相等比较算法。参考链接:http://www.ecma-international.org/ecma-262/7.0/index.html#sec-strict-equality-comparison
Object.is()的特殊处理
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() 采用相同值比较算法。参考链接:http://www.ecma-international.org/ecma-262/7.0/index.html#sec-samevalue
总结
总结
在大多数情况下,严格相等运算符是比较值的理想选择。
若需直接检查 NaN 值,或对负零和正零进行更严格的区分,Object.is() 是更佳选择。
此外,Object.is() 作为函数式比较方法,在函数式编程等场景中同样具有实用价值。
来源:dmitripavlutin.com,作者:Dmitri Pavlutin,翻译:公众号《前端全栈开发者》
到此这篇关于详解JavaScript中的Object.is()与"==="运算符总结的文章就介绍到这了,更多相关JavaScript中的Object.is()与"==="运算符内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!