likes
comments
collection
share

JavaScript中 ==, === 和Object.is的等式比较

作者站长头像
站长
· 阅读数 48

了解 JavaScript 相等性比较的选项。什么是抽象相等?什么是严格相等,以及 Object.is()方法有何不同?

传统上 JavaScript 提供了 2 个用于相等比较的特殊运算符:

  • ==​​ 对于抽象相等比较,它在操作数之间执行松散相等。
  • ===​​ 对于严格相等比较,它在操作数之间执行严格相等。

对于 ES6,我们又多了一种使用 Object.is ​方法执行 同值相等​ 的方法。在本文中,我们将了解它们的用法、影响和用例。

抽象平等比较==

抽象相等比较(又名松散相等比较)在将两个值转换为公共类型后比较两个值是否相等。在这种类型的比较中,类型强制​ 由 JavaScript 执行。

类型强制是将值从一种数据类型自动或隐式转换为另一种数据类型(例如字符串到数字)。

让我们通过一个例子来理解这一点。考虑两种不同于啮齿动物的动物,即仓鼠和豚鼠。我毫不怀疑,与 ==​​ 的相等比较将通过将它们的类型强迫成啮齿动物来返回 true​​。

JavaScript中 ==, === 和Object.is的等式比较

在编程中

true == 1; // true
'0' == 0; // true
[9, 2] == '9,2'; // true
"" == 0; // true

如果您是 JavaScript 新手并拥有来自另一种编程语言的值比较经验,您会发现 ==​ 运算符很奇怪。

这还不是全部。==​ 运算符还有一个邪恶的姐妹叫做 !=​ . 它对两个值进行正好相反的比较来检查它们是否不相等。然而,就像 ==​ ,它也会进行类型转换,导致混淆。

严格平等比较===

在严格的相等比较中,豚鼠和仓鼠不相等 ===​ 比较两个值以获得相等。在比较之前,这两个值都不会隐式转换(强制)为其他值。

使用严格相等比较,如果值具有不同的类型,则认为值不相等

true === 1 // false
'0' === 0 // false
[9, 2] === '9,2' // false
"" === 0 // false

===​ 还有一个名为 ! ==​ 的天使姐妹,它有助于发现两个值是否严格不相等。我们应该几乎总是使用严格类型(=== ​和 !==​ ) 比较而不是松散类型( ==​ 和 !=​ )比较。

===​ 处理 NaN​ 、-0​ 和 +0​ 的方式有点不同。

NaN === NaN // false
+0 === -0 // true

严格相等将 NaN​ 视为与包括自身在内的所有其他值不相等。它也不关心 +0​ 和 -0​ 之间的区别。现在在某些情况下,这些差异可能很重要,严格相等可能会失败。

同值平等与 Object.is​​

使用 ES6,我们有了一种新的方法来确定这两个值是否相同。

Object.is(0, 0) // true
Object.is(null, null) // true
Object.is(undefined, undefined) // true
Object.is(true, 1) // false
Object.is(+0, -0) // false
Object.is(NaN, NaN) // true

来自 MDN

如果以下条件之一成立,则两个值相同:

  • 都为 undefined
  • 都为 null
  • 都是 true 或者 都是 false
  • 两个长度相同的字符串,字符顺序相同
  • 两个相同的对象(表示两个对象具有相同的引用)
  • 两个相同数字
  • 两者 ​+0
  • 两者 -0
  • 两者​ NaN
  • 两者都非零,都不是 NaN,并且都有相同的值

测验时间

让我们试着根据迄今为止学到的概念回答几个问题,

1.为什么你认为所有情况下的输出都是 false​ ?

let obj1 = {name: 'GreenRoots'};
let obj2 = {name: 'GreenRoots'}; 

obj1 == obj2; // false
obj1 === obj2; // false
Object.is(obj1, obj2); // false

这是因为 JavaScript 有五种 按值传递​ 的原始数据类型:Boolean, String, Number, null, and undefined.

其余的数据类型称为非原始数据类型,主要是对象(包括数组、函数和对象本身),这些非原始数据类型通过 引用传递

因此,上面的 Obj1 和 Obj2 都在创建它们的不同内存位置保存值。因此,比较总是为 false​.

2.你认为 Object.is 对比结果真的重要吗 ===​?

是的。React 使用 Object.is ​算法来比较 state。

比较图表

以下是使用 ==​, ===​ 和 Object.is ​比较样本值的比较图表:

JavaScript中 ==, === 和Object.is的等式比较

转载自:https://juejin.cn/post/7244203575034462268
评论
请登录