知识点补充:
相等和不相等——先转换再比较 (==)
全等和不全等——仅比较而不转换 (===)
Boolean转型函数的转换规则如下:
- 针对布尔值:true -> true false-> false
- 针对数值: 0-> false 1->true NaN->false
- 针对字符串: '' -> false 非空->true
- 针对undefined: undefined -> false
- 针对null : null-> false
- 针对对象: 任何对象->true //所以![] !{} 为false
null、undefined、NaN以及空字符串('')取反都为true,其余都为false。
//解释一
[]==[] //false
{}=={} //false
//解释二
[] == ![] //true
[] == ! [] -> [] == false -> [] == 0 -> ([]).toString() == 0 -> '' == 0 -> 0 == 0 -> true
{} == !{} //false
{} == ! {} -> {} == false -> {} == Number(false) -> {} == 0 -> ({}).toString() == 0 -> [object Object] == 0 -> false
解释一:每次使用 [] 都是新建一个数组对象。当数组比较的时候其实比较的是他们的引用。[] == []的时候,从值上尽管两边都是[]但是从引用上两边是不相等的。
解释二:两者判断的差别在于([]).toString()结果是'',变成数字是0; ({}).toString()结果是[object Object],变成数字是NaN