JavaScript中 ==, === 和Object.is的等式比较
了解 JavaScript 相等性比较的选项。什么是抽象相等?什么是严格相等,以及 Object.is()方法有何不同?
传统上 JavaScript 提供了 2 个用于相等比较的特殊运算符:
-
==
对于抽象相等比较,它在操作数之间执行松散相等。 -
===
对于严格相等比较,它在操作数之间执行严格相等。
对于 ES6,我们又多了一种使用 Object.is
方法执行 同值相等
的方法。在本文中,我们将了解它们的用法、影响和用例。
抽象平等比较==
抽象相等比较(又名松散相等比较)在将两个值转换为公共类型后比较两个值是否相等。在这种类型的比较中,类型强制
由 JavaScript 执行。
类型强制是将值从一种数据类型自动或隐式转换为另一种数据类型(例如字符串到数字)。
让我们通过一个例子来理解这一点。考虑两种不同于啮齿动物的动物,即仓鼠和豚鼠。我毫不怀疑,与 ==
的相等比较将通过将它们的类型强迫成啮齿动物来返回 true
。
在编程中
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
比较样本值的比较图表:
转载自:https://juejin.cn/post/7244203575034462268