4

前几天我遇到了一个有趣的错误。我正在测试一个数组以查看它是否评估为布尔值 false,但是直接评估它总是返回 true:

> !![]
  true

好的,所以基本上我放在那里的任何数组都会true不管,对吧?我在 JavaScript 控制台中运行它只是为了好玩:

> [] == true
  false

这里发生了什么?

4

1 回答 1

3

它与抽象相等比较算法与用于将值转换为布尔值的算法有关。

通过查看规范,我们可以看到第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

于 2013-09-26T17:54:01.737 回答