跳到主要内容

JavaScript 中的相等性判断

首先根据列表中的内容,来了解 JavaScript 中的相等性判断的方法

xy=====Object.isSameValueZero
undefinedundefined✅ true✅ true✅ true✅ true
nullnull✅ true✅ true✅ true✅ true
truetrue✅ true✅ true✅ true✅ true
falsefalse✅ true✅ true✅ true✅ true
'foo''foo'✅ true✅ true✅ true✅ true
00✅ true✅ true✅ true✅ true
+0-0✅ true✅ true❌ false✅ true
+00✅ true✅ true✅ true✅ true
-00✅ true✅ true❌ false✅ true
0n-0n✅ true✅ true✅ true✅ true
0false✅ 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
nullundefined✅ true❌ false❌ false❌ false
nullfalse❌ false❌ false❌ false❌ false
undefinedfalse❌ false❌ false❌ false❌ false
{ foo: 'bar' }{ foo: 'bar' }❌ false❌ false❌ false❌ false
new String('foo')new String('foo')❌ false❌ false❌ false❌ false
0null❌ false❌ false❌ false❌ false
0NaN❌ false❌ false❌ false❌ false
'foo'NaN❌ false❌ false❌ false❌ false
NaNNaN❌ false❌ false✅ true✅ true

JavaScript 提供了三种不同的值比较操作:

== 宽松相等

这个运算符会比较不同类型的操作数,并尝试强制类型转换。

这里不介绍它对不同类型操作的转换规则.并且也建议在日常开发中减少使用该操作符的次数.

=== 严格相等

两个被比较的值在比较前都不进行隐式转换。

可以从表中看出有一下几种情况:

  • 如果两个被比较的值具有不同的类型,这两个值是不相等的。
  • 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()方法使用的是=== 严格相等比较方法.