javascript中的 非严格等号(==)
运算符对于不同数据类型的比较, 会对运算符两边进行 隐式转换, 这篇文章将总结一下, 以便应对项(mian)目(shi)中的奇怪现象.
非严格等号比较规则
javascript 使用 Abstract Equality Comparison Algorithm 规则进行比较
总结如下:
- | 比较场景 | 结果 | 说明 |
---|---|---|---|
1 | 两边类型相同 | 同全等(===)规则 | (值类型)类型相同,值相等为true; (引用类型)引用同一对像才为true; |
2 | null 与 undefined |
true |
|
3 | Number 与 String |
number == toNumber(string) |
0 == "" //true "01" == 1 //true |
4 | Boolean 与 (any) |
toNumber(bool) == (any) |
true == 1 //true false == 0 // true false == '' // true |
5 | String / Number 与 Object |
x == toPrimitive(object) |
"[object Object]" == {} // true 1 == {valueOf : function(){ return "1" }} //true |
6 | 其它情况 | false |
0 == null "" == undefined undefined == {} |
toPrimitive 规则:
优先调用对像的valueOf
方法转换;
如果对像没有valueOf
方法, 或者valueOf
方法返回的值不是原数据类型,
则调用toString
方法转换;