为什么?
先转换再比较 (==)
仅比较而不转换 (===)
==转换规则?
==比较运算符会先转换操作数(强制转换),然后再进行比较
①如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1;
②如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;
在双等号 左右两边类型相等时 采用三等号也就是严格运算符的判定规则
[ ] == ![ ] 解题思路? ![] 会变成 false,false会变成0;也就是==右侧 是 0; ==在进行比较前,如果有一侧是数字,会将另一侧也转化为数字类型,才会进行比较。 Number([]) // 0; 先在等号左侧也是0 两侧都是0 所以是true。 [] == ![] -> [] == false -> [] == 0; ==右侧的转换 因为右侧是数字,所以左侧也要转换为数字类型,才会进行比较 Number([]) == 0 -> 0 == 0 //true
[] == [] // false 在双等号 左右两边类型相等时 采用三等号也就是严格运算符的判定规则 对于对象(数组也是对象)只看双方地址,地址一样则返回true,所以[]===[]地址不一样,返回fasle。
{}=={} // false
同理,等号两侧类型相同,采用三等号判定,比的是地址,所以是false
{} == !{} // false {} == !{} --> {} == false --> {} == 0; 等号右侧侧的转化 因为双等号比较前,会先转化为相同的类型,所以左侧也要转为数字类型 Number( {} ) == 0 --> NaN == 0 //false NaN和任何数字比都是false,所以{} == !{} // false