javascript中 非严格等号(==)运算符的比较规则

javascript中的 非严格等号(==)运算符对于不同数据类型的比较, 会对运算符两边进行 隐式转换, 这篇文章将总结一下, 以便应对项(mian)目(shi)中的奇怪现象.

非严格等号比较规则

javascript 使用 Abstract Equality Comparison Algorithm 规则进行比较

总结如下:

- 比较场景 结果 说明
1 两边类型相同 同全等(===)规则 (值类型)类型相同,值相等为true;
(引用类型)引用同一对像才为true;
2 nullundefined true
3 NumberString number == toNumber(string) 0 == "" //true
"01" == 1 //true
4 Boolean(any) toNumber(bool) == (any) true == 1 //true
false == 0 // true
false == '' // true
5 String / NumberObject x == toPrimitive(object) "[object Object]" == {} // true
1 == {valueOf : function(){ return "1" }} //true
6 其它情况 false 0 == null
"" == undefined
undefined == {}

toPrimitive 规则:
优先调用对像的 valueOf 方法转换;
如果对像没有 valueOf 方法, 或者 valueOf 方法返回的值不是原数据类型,
则调用 toString 方法转换;