JavaScript数组的布尔评估

Boolean evaluation of JavaScript arrays

前几天我遇到了一个有趣的虫子。我在测试一个数组,看它的值是否为布尔值false,但是直接计算它总是返回true:

1
2
> !![]
  true

好吧,所以基本上我放在里面的任何数组都会是true,不管怎样,对吗?我在javascript控制台中运行这个只是为了好玩:

1
2
> [] == true
  false

这是怎么回事?


它和抽象的相等比较算法以及将值转换为布尔值的算法有关。

通过查看规范,我们可以看到9号点。是唯一一个定义当类型(左侧值)为对象时应该发生什么的类型。但是它指定右边的值必须是字符串或数字。

9 . If Type(x) is Object and Type(y) is either String or Number,
return the result of the comparison ToPrimitive(x) == y.

[] == true

typeof []'object',所以我们很好,但typeof true不是'string''number',它是'boolean',所以退回到最后一个陈述,第10点。

10 . Return false.

然而,!![]翻译成!!Boolean([]),由于[]是一个穿透值(对象是),它与写入!!true相同,后者返回true