JS中的"=="转换规则


关于 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() 依次调用 object 的 valueOf 、 toString 方法,直到获取原始值。

//  number * object
321 == { valueOf: () => 321 } // true

// string * object 下面证明了是 Number(object) 而不是 String(object),两个过程的区别在 valueOf、toString 方法调用顺序不同
'cba' == { valueOf: () => 'abc', toString: () => 'cba' };  // false
'cba' == { valueOf: () => 'cba', toString: () =>  'abc'};  // true


文章作者: 弈心
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 弈心 !
评论
  目录