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 许可协议。转载请注明来源 弈心 !
评论
  目录