JavaScript 中的相等性判断
首先根据列表中的内容,来了解 JavaScript 中的相等性判断的方法
x | y | == | === | Object.is | SameValueZero |
---|---|---|---|---|---|
undefined | undefined | ✅ true | ✅ true | ✅ true | ✅ true |
null | null | ✅ true | ✅ true | ✅ true | ✅ true |
true | true | ✅ true | ✅ true | ✅ true | ✅ true |
false | false | ✅ true | ✅ true | ✅ true | ✅ true |
'foo' | 'foo' | ✅ true | ✅ true | ✅ true | ✅ true |
0 | 0 | ✅ true | ✅ true | ✅ true | ✅ true |
+0 | -0 | ✅ true | ✅ true | ❌ false | ✅ true |
+0 | 0 | ✅ true | ✅ true | ✅ true | ✅ true |
-0 | 0 | ✅ true | ✅ true | ❌ false | ✅ true |
0n | -0n | ✅ true | ✅ true | ✅ true | ✅ true |
0 | false | ✅ true | ❌ false | ❌ false | ❌ false |
"" | false | ✅ true | ❌ false | ❌ false | ❌ false |
"" | 0 | ✅ true | ❌ false | ❌ false | ❌ false |
'0' | 0 | ✅ true | ❌ false | ❌ false | ❌ false |
'17' | 17 | ✅ true | ❌ false | ❌ false | ❌ false |
[1, 2] | '1,2' | ✅ true | ❌ false | ❌ false | ❌ false |
new String('foo') | 'foo' | ✅ true | ❌ false | ❌ false | ❌ false |
null | undefined | ✅ true | ❌ false | ❌ false | ❌ false |
null | false | ❌ false | ❌ false | ❌ false | ❌ false |
undefined | false | ❌ false | ❌ false | ❌ false | ❌ false |
{ foo: 'bar' } | { foo: 'bar' } | ❌ false | ❌ false | ❌ false | ❌ false |
new String('foo') | new String('foo') | ❌ false | ❌ false | ❌ false | ❌ false |
0 | null | ❌ false | ❌ false | ❌ false | ❌ false |
0 | NaN | ❌ false | ❌ false | ❌ false | ❌ false |
'foo' | NaN | ❌ false | ❌ false | ❌ false | ❌ false |
NaN | NaN | ❌ false | ❌ false | ✅ true | ✅ true |
JavaScript 提供了三种不同的值比较操作:
- === 严格相等
- == 宽松相等
- Object.is()
== 宽松相等
这个运算符会比较不同类型的操作数,并尝试强制类型转换。
这里不介绍它对不同类型操作的转换规则.并且也建议在日常开发中减少使用该操作符的次数.
=== 严格相等
两个被比较的值在比较前都不进行隐式转换。
可以从表中看出有一下几种情况:
- 如果两个被比较的值具有不同的类型,这两个值是不相等的。
- NaN !== NaN
- +0 === -0
Object.is()
Object.is判断的方法和严格相等有下面两点不同:
- NaN === NaN
- +0 !== -0
Same-value-zero equality
这是一个不公开的api,经常使用的Array.prototype.includes()方法使用了这个api。 以下两个等式都成立:
- NaN === NaN
- +0 === -0
信息
上面说到了Array.prototype.includes()方法使用了Same-value-zero equality比较方法.数组的另外一个查找api Array.prototype.indexOf()方法使用的是=== 严格相等比较方法.