前几天我遇到了一个有趣的错误。我正在测试一个数组,看看它是否被评估为布尔值false,但只是直接评估它总是返回true:
> !![]
true
好的,基本上我放在那里的任何数组都是true
,对吧?我在JavaScript控制台中运行它只是为了好玩:
> [] == true
false
这里发生了什么?
答案 0 :(得分:3)
它与The Abstract Equality Comparison Algorithm与用于将值转换为布尔值的算法有关。
通过查看the spec,我们可以看到点数 9。是唯一一个定义类型(左侧值)为Object时应该发生什么的点数即可。但是,它指定右侧值必须是String或Number 。
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
}。