要理解为什么在JavaScript中[] == ![]
为true
,需要了解一下JavaScript的类型转换和比较操作。当使用双等号==
进行比较时,如果两边的操作数类型不同,JavaScript会尝试将它们转换为相同的类型,然后进行比较。
隐性类型转换步骤
一、首先看双等号前后有没有NaN,如果存在NaN,一律返回false。
二、再看双等号前后有没有布尔,有布尔就将布尔转换为数字。(false是0,true是1)
三、null, undefined不会进行类型转换, 但它们俩相等
我们可以将[] == ![]
这个表达式分解为以下几个步骤:
![]
的计算结果是false
。这是因为在JavaScript中,对象转换为布尔为true,而!
操作符将其取反,得到false,因为有了布尔值,所以转化为数字0。
- 根据ECMAScript规范,空数组
[]先转化为字符串'',再
转换为数字时等于0
。 - 由于转换后的值相等
(0 == 0)
,所以[] == ![]
的结果为true
。