console.log([] == ![]); //true
console.log({} == !{}); //false
一、双等和三等的区别
双等:先隐式转换再进行比较
三等:直接进行比较(包括数据类型)
二、隐式转换规则
对象→字符串→数值
布尔→数值
ECMAScript 等性运算符中写到:
在比较时,该运算符还遵守下列规则:
- 值 null 和 undefined 相等。
- 在检查相等性时,不能把 null 和 undefined 转换成其他值。
- 如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
- 如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。
重要提示:即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。
三、执行顺序 [] == ![]
1.运算符优先级 ! 大于 ==,so执行![]
![] == false (此时为布尔值,继续转换为数值) → false 结果为 0
false == 0 //由此可知,右侧结果为0
此时表达式为:[] == 0
2.运算 [] == 0
根据上方ECMAScript 等性运算符中第四条进行运算
执行 [].valueOf() == [] //返回[]
继续执行 [].toString() == '' //返回空串''
因==右边为数值,so继续转换 '' == 0 //由此可知,左侧结果为0
此时表达式为:0 == 0
四、执行顺序 {} == !{}
前面步骤同上,但 {}.toString() 运算结果为[object Object]
继续转换数值 Number("[object Object]") 为 NaN