前几天我遇到了一个有趣的错误。我正在测试一个数组以查看它是否评估为布尔值 false,但是直接评估它总是返回 true:
> !![]
true
好的,所以基本上我放在那里的任何数组都会true
不管,对吧?我在 JavaScript 控制台中运行它只是为了好玩:
> [] == true
false
这里发生了什么?
前几天我遇到了一个有趣的错误。我正在测试一个数组以查看它是否评估为布尔值 false,但是直接评估它总是返回 true:
> !![]
true
好的,所以基本上我放在那里的任何数组都会true
不管,对吧?我在 JavaScript 控制台中运行它只是为了好玩:
> [] == true
false
这里发生了什么?
它与抽象相等比较算法与用于将值转换为布尔值的算法有关。
通过查看规范,我们可以看到第9点是唯一定义当Type(left side value) 为 Object时应该发生什么的点。但是,它指定右侧值必须是 String 或 Number。
9. 如果 Type(x) 是 Object 并且 Type(y) 是 String 或 Number,则返回 ToPrimitive(x) == y 的比较结果。
看着[] == true
:
typeof []
is'object'
所以我们很好,但typeof true
不是'string'
or 'number'
,它是'boolean'
,所以它回退到最后一条语句,第10 点。
10. 返回假。
但是!![]
转换为!!Boolean([])
,并且由于[]
是一个 thruty 值(对象是),它与 write 相同!!true
,它返回true
。