ECMAScript 2017 中的 Object.is 与 === 的区别

ECMAScript 2017 中的 Object.is 与 === 的区别

在 JavaScript 中,判断两个值是否相等是常常需要解决的问题。而在 ECMAScript 2017 中,新引入了一个方法 Object.is() 来进行值的比较,那么它与原生的 === 操作符有什么区别呢?

=== 是严格相等运算符,用来判断两个值是否完全相等,即类型和值都相等,比较结果是布尔值 true 或 false。而 Object.is() 则是基于 SameValue 原则进行比较,用来判断两个值是否相等,比较结果是布尔值 true 或 false。

但是,SameValue 原则与严格相等运算符的行为类似,但存在一些细微的差别。下面来看一下 Object.is() 和 === 在比较不同类型的值时的行为:

  1. 比较数字
------------ --- -- ----
-------------- ----- -- ----
------------ ---- -- -----

- --- -- -- ----
--- --- ---- -- -----
- --- --- -- ----

可以看到,Object.is() 在比较 NaN 和 NaN 时返回 true,而 === 返回 false;在比较 0 和 -0 时,Object.is() 返回 false,而 === 返回 true。

这是因为,NaN 在 JavaScript 中被认为不等于任何值,包括它本身。而对于正负 0 来说,它们在数值上是相等的,但有着不同的符号,而 Object.is() 会将它们视为不相等的值。

  1. 比较字符串
---------------- ------- -- ----

----- --- ------ -- ----

无论是 Object.is() 还是 ===,它们在比较字符串时都只考虑值相等,不会考虑大小写或位置。

  1. 比较布尔值
--------------- ------ -- ----
---------------- ------- -- ----

---- --- ----- -- ----
----- --- ------ -- ----

在比较布尔值时,Object.is() 和 === 的行为是一致的,都只考虑值相等。

  1. 比较对象
----- ---- - - ---- ----- --
----- ---- - - ---- ----- --

--------------- ------ -- ----
--------------- ------ -- -----

---- --- ----- -- ----
---- --- ----- -- -----

在比较对象时,Object.is() 和 === 会比较它们在内存中所处的位置,而不是它们的属性是否完全相等。只有当两个对象的引用指向同一个位置时,Object.is() 才会返回 true,而 === 也是如此。

结论

通过以上分析可以看出,Object.is() 和 === 在很多情况下的行为类似,但在比较 NaN 和正负 0 时会有所不同。另外,Object.is() 比较对象时不考虑属性是否相等,而是比较它们在内存中的位置。

因此,在比较两个值时,要根据具体的情况选择使用 === 还是 Object.is()。如果需要比较所有类型的值,包括 NaN 和正负 0,可以使用 Object.is(),否则建议还是使用 === 进行比较。

示例代码

----- ---- - - ---- ----- --
----- ---- - - ---- ----- --
----- ---- - --- -- ---
----- ---- - --- -- ---

------------------------ ---- -- ----
-------------------------- ------ -- ----
------------------------ ----- -- -----
---------------------------- -------- -- ----
--------------------------- ------- -- ----
---------------------------- -------- -- ----
--------------------------- ------- -- ----
--------------------------- ------- -- -----
--------------------------- ------- -- ----
--------------------------- ------- -- -----

------------- --- --- -- ----
--------------- --- ----- -- -----
------------- --- ---- -- ----
----------------- --- ------- -- ----
---------------- --- ------ -- ----
----------------- --- ------- -- ----
---------------- --- ------ -- ----
---------------- --- ------ -- -----
---------------- --- ------ -- ----
---------------- --- ------ -- -----

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/670ce9d75f551281025c0013