对于Javacript中的等于操作符用两个等于号(==)表示,如果操作数相等,则会返回true。不等于操作符用叹号和等于号(!=)表示,如果两个操作符不想等,则会返回true。这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作符是否相等。
在转换操作数的类型时,相等和不相等操作服遵循以下规则:
- 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。false转换为0,true转换为1。
- 如果一个操作数是字符串,另一个操作符是数值,则尝试将字符串转换为数值,再比较是否相等。
- 如果一个操作数是对象,另一个操作数不变,则调用对象的valueOf()方法取得其原始值,再根据前面的规则进行比较。
在进行比较时,这两个操作符会遵循如下规则:
- null和undefined相等
- null和undefined不能转换为其他类型的值再进行比较
- 如果有任一操作数是NaN,则相等操作符返回false,不相等操作符返回true。记住:即使两个操作数都是NaN,相等操作符也返回false,因为按照规则,NaN不等于NaN
- 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true。否则,两者不相等。
下表总结了一些特殊情况及比较的结果:
表达式 | 结果 |
null==undefined | true |
"NaN"==NaN | false |
5==NaN | false |
NaN==NaN | false |
NaN!=NaN | true |
false==0 | true |
true==1 | true |
true==2 | false |
undefined==0 | false |
null==0 | false |
"5"==5 | true |
[]==![]的转换过程
[]==![] -> []==false -> []==0 -> ''==0 -> 0==0 -> true
注意:对象没有valueOf方法时就调用toString方法,[].toString()=''
{}==!{}的转换过程
{}==!{} -> {}==false -> {}==0 -> NaN==0 -> false
注意:{}.toString()=[object object],Number({}.toString())=NaN