在 JavaScript 中,[] == ![]
的值是 true
。这个结果可能有些出乎意料,但可以通过以下步骤来解释:
1、因为!
的优先级高于==
,先转换![]
:
[]
布尔上下文中被视为true
,![]
为false
2、转换 [] == false
:
- 根据抽象相等比较规则,当比较一个对象(或数组)和一个布尔值时,布尔值会被转换为数字:
false
转为0
,true
转为1
。 - 所以,比较变成了
[] == 0
3、转换 [] == 0
:
- 当对象与数字进行比较时,对象会尝试通过调用其
valueOf()
方法(如果没有valueOf()
方法或者valueOf()
方法返回的不是基本值,则尝试toString()
方法)来转换为一个原始值。 - 空数组的
toString()
方法返回空字符串""
。
4、转换 "" == 0
:
""
和数字0
进行比较时,""
会转换为数字0
- 因此,比较变成了
0 == 0