2013-09-26 79 views
3

前几天我遇到了一个有趣的bug。我在测试一个数组,看它是否评估为布尔值false,但只需直接评价它总是返回真:JavaScript数组的布尔值评估

> !![] 
    true 

好了,所以基本上我把所有阵列会有true不管,对不对?我在JavaScript控制台中运行它只是为了好玩:

> [] == true 
    false 

这是怎么回事?

+1

关于这些问题,我想你会喜欢这个话题:https://www.destroyallsoftware.com/talks/wat –

+0

你可能想看看你的答案这个问题:http:// stackoverflow .com/questions/5491605/javascript-empty-array-while-the-true-and-false-at-the-the-time- – Steve

+0

你看过我的回答吗? – plalx

回答

1

它与The Abstract Equality Comparison Algorithm对比用于将值转换为布尔值的算法。

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

9。如果Type(x)是Object且Type(y)是String或Number,则 会返回比较结果ToPrimitive(x)== y。

看着[] == true

typeof []'object',所以我们都很好,但typeof true不是'string''number',它是​​,所以这回退到最后一条语句,点数

10。返回false。

然而!![]转化为!!Boolean([]),并且由于[]是thruty值(对象),它是相同的象写!!true,它返回true