前几天我遇到了一个有趣的bug。我在测试一个数组,看它是否评估为布尔值false,但只需直接评价它总是返回真:JavaScript数组的布尔值评估
> !![]
true
好了,所以基本上我把所有阵列会有true
不管,对不对?我在JavaScript控制台中运行它只是为了好玩:
> [] == true
false
这是怎么回事?
前几天我遇到了一个有趣的bug。我在测试一个数组,看它是否评估为布尔值false,但只需直接评价它总是返回真:JavaScript数组的布尔值评估
> !![]
true
好了,所以基本上我把所有阵列会有true
不管,对不对?我在JavaScript控制台中运行它只是为了好玩:
> [] == true
false
这是怎么回事?
它与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
。
关于这些问题,我想你会喜欢这个话题:https://www.destroyallsoftware.com/talks/wat –
你可能想看看你的答案这个问题:http:// stackoverflow .com/questions/5491605/javascript-empty-array-while-the-true-and-false-at-the-the-time- – Steve
你看过我的回答吗? – plalx