[]==![](true)、{}==!{}(false)

254 阅读2分钟

对于Javacript中的等于操作符用两个等于号(==)表示,如果操作数相等,则会返回true。不等于操作符用叹号和等于号(!=)表示,如果两个操作符不想等,则会返回true。这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作符是否相等。

在转换操作数的类型时,相等和不相等操作服遵循以下规则:

  • 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。false转换为0,true转换为1。
  • 如果一个操作数是字符串,另一个操作符是数值,则尝试将字符串转换为数值,再比较是否相等。
  • 如果一个操作数是对象,另一个操作数不变,则调用对象的valueOf()方法取得其原始值,再根据前面的规则进行比较。

在进行比较时,这两个操作符会遵循如下规则:

  • null和undefined相等
  • null和undefined不能转换为其他类型的值再进行比较
  • 如果有任一操作数是NaN,则相等操作符返回false,不相等操作符返回true。记住:即使两个操作数都是NaN,相等操作符也返回false,因为按照规则,NaN不等于NaN
  • 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true。否则,两者不相等。

下表总结了一些特殊情况及比较的结果:

表达式结果
null==undefinedtrue
"NaN"==NaNfalse
5==NaNfalse
NaN==NaNfalse
NaN!=NaNtrue
false==0true
true==1true
true==2false
undefined==0false
null==0false
"5"==5true

[]==![]的转换过程

[]==![] -> []==false -> []==0 -> ''==0 -> 0==0 -> true

注意:对象没有valueOf方法时就调用toString方法,[].toString()=''

{}==!{}的转换过程

{}==!{} -> {}==false -> {}==0 -> NaN==0 -> false

注意:{}.toString()=[object object],Number({}.toString())=NaN