想到这个的主要原因是最近看到了一个非常有趣的题目

[] == ![]

大家有想到结果是什么吗?其实结果是 true,下面是具体的判断链

[] == ![] -> [] == false -> [] == 0 -> [].valueOf() == 0 -> [].toString() == 0 -> ” == 0 -> 0 == 0 -> true

查看原文

我在这里也重新看了一下<JavaScript 高级程序设计>中对于相等操作符的解释,在这里做一下摘录

转换规则如下

如果有一个操作数是布尔值,先把布尔转换为数字 也就是 false>0 true>1 继续比较 如果一个是字符串 一个是数字 把字符串转换为数字后 继续比较 如果一个是对象 一个不是 先调用对象的 valueOf 方法 继续比较

还有如下的判断规则

null 和 undefined 相等 在比较之前 null 和 undefined 不能转换为其他任何值 如果有一个 NaN 相等操作符返回 false 可以认为 NaN 几乎不等于任何值 如果两个都是对象 判断两个对象是否指向同一个对象

全等操作符 === 其实就是在相等的基础上,增加了类型转换的限制

如果两个对比数未经过任何类型转换,就相等,那就返回 true,其他均为 false