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