先自我检测一下类型转换,如果都对的话,就不用往下看了。
console.log("true"==1); //
console.log(NaN==NaN); //
console.log("null"==null); //
console.log("undefined"==undefined); //
console.log("null"==undefined); //
console.log(null==undefined); //
console.log(null==0); //
console.log(null==false); //
console.log(undefined==false); //
console.log(undefined==0); //
console.log({}=={}); //
console.log({}==!{}); //
console.log({}==[]); //
console.log({}==0); //
console.log({}==true); //
console.log({}==''); //
console.log([]==[]); //
console.log([]==''); //
console.log([]==![]); //
从一道鄙视题说起 为什么 []==![] 为true
按照优先级,先计算![],再比较[]==![],也就是Boolean([])结果为true,![]结果为false。 然后再比较[]==false。或许你知道结果为true,那你知道背后的东西吗?
当程序运行到[]==false时,将false转为number类型的0。左侧因为是引用类型,需要调用valueOf或者toString转为原始类型,再进行比较。很多人认为[]调用valueOf方法转为数字0,其实并不是的,这里调用的是toString方法,转为"",空字符串。""==0比较,自然调用Number方法进行转换 0==0自然成立的。 [].valueOf() 为[] toString 为 ""
{}==!{}为false
解析步骤,!{}为false,{}==false转换为{}==0,转换为({}.toString())==0,转换为"[object object]" == 0,转化为NaN==0,false
特例
1.undefined ==null,不要转换任何值进行比较.
2.NaN与任何一个值用相等操作符比都是false
补充:[]==0,其实是先检测对象及原型有没有valueOf(),使用valueOf()返回的值不是原始类型,此时再调用toString(),再进行转换比较。