JavaScript数组的布尔评估
我前几天遇到了一个有趣的bug。 我正在测试一个数组,以查看它是否评估为布尔值false,但直接评估它总是返回true:
> !![]
true
好吧,基本上,我放在那里的任何阵列都是true
无论如何,对吧? 我在JavaScript控制台中运行它仅仅是为了好玩:
> [] == true
false
这里发生了什么?
它与“抽象平等比较算法”与用于将值转换为布尔值的算法有关。
通过查看规范,我们可以看到,第9个点是定义当Type(左侧值)为Object时应该发生的事情的唯一一个。 但是它指定右侧的值必须是字符串或数字 。
9。 如果Type(x)是Object且Type(y)是String或Number,则返回比较结果ToPrimitive(x)== y。
看着[] == true
:
typeof []
是'object'
所以我们很好,但typeof true
不是'string'
或'number'
,它是'boolean'
,所以它回退到最后一个语句,点数为10。
10。 返回false。
但是!![]
翻译成!!Boolean([])
,并且因为[]
是一个thruty值(对象是),所以它与写入!!true
相同,它返回true
。