关于 js 中 == 运算的三句话判定法则
1.类型一致时比较原始值或引用值,值相同则相等(例外: NaN 不等于自身)
2.null 仅与 undefined 互等
3.所有运算子自动转为 number,若 string 转为 NaN 则回退
相等操作符(==)会对操作值进行隐式转换后进行比较
参数类型1 | 参数类型2 | 强制转换 |
---|---|---|
null | undefined | 不转换,总是返回true |
null或undefined | 其它任何非null或undefined的类型 | 不转换,总是返回false |
原始类型:string、number或boolean | Date对象 | 将原始类型转换成数字;将Date对象转换为原始类型。(优先尝试toString方法,再尝试valueOf方法) |
原始类型:string、number或boolean | 非Data对象 | 将原始类型转换成数字;将非Date对象转换为原始类型。(优先尝试toString方法,再尝试valueOf方法) |
原始类型:string、number或boolean | 原始类型:string、number或boolean | 将原始类型转换成数字 |
NaN | 任意类型(包括NaN) | 不转换,总是返回false |
object对象 | object对象 | 较它们是不是指向同一个对象 |
1.number类型与string类型比较,string会通过Number()
函数转换为number类型
'' == '0' //false
0 == ''//true;
0 == '0'//true
' \t\r\n '==0//true
2.null和undefined类型比较始终相等
null == undefined //true
3.布尔类型与其它任何类型进行比较,布尔类型将会转换为number类型
false == 'false'//false
false == '0'//true
false == null//false
null == undefined //true
4.number类型或string类型与object类型进行比较,object 自动转为 number。而 Number(object) 这一转换过程依次调用 object.valueOf、object.toString 直到获取原始值。
var a = 0, b = {};
console.log(b.valueOf()); // {},得到值本身,继续调用 toString 方法
console.log(b.toString()); // "[object Object]"
a == b; // 最终转化结果为 0 == "[object Object]",答案为 false
5.如果一个操作值为NaN,则相等比较返回false
NaN ==0 //false
NaN ==1 //false
NaN =="" //false
NaN =={} //false
NaN ==NaN //false
5.如果两个操作值都是对象,则比较它们是不是指向同一个对象
var b={id:1}
var c={id:1}
b==c //false
var b={id:1}
var a=b
var c=b
a==c //true
Number(