关于 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(