JavaScript:[]的奇怪布尔值

时间:2013-11-13 21:48:50

标签: javascript

我一直在学习JavaScript已经有一段时间了,我知道最好不要实际依赖这种行为,但我很好奇......为什么空数组[]看似有冲突的布尔标识?

这是真实的:[] && true评估为true ...然而,它是错误的:[] == false评估为true

然而,它的双重否定是正确的:!![]评估为true。但它也(使用松散的平等)等于它自己的否定:![] == []评估为true

其数值为falsy:+[] && true的计算结果为0

它的字符串表示是假的:[].toString() && true计算结果为""

[]这样一个难题的明确原因吗?

3 个答案:

答案 0 :(得分:1)

我认为结果是合理的。唯一一个我不确定的是+[],但我可能已经找到了。就像你说的那样,松散的比较可能会产生误导,但这对我来说很有意义。

console.log([] && true); //true - there is an array

console.log([] == false); //true, the array is empty

console.log(![]); //false, there is an array

console.log(!![]); //true, there isn't not an array

console.log(![] == []); //true, no array is loosely like an empty array

console.log(+[]); //0, I think this converts the array to a number, 0 being the logical choice. +[1] will return "1" and +[1,2] is "NaN" - which seems to be because the conversion is no longer feasible.

console.log([].toString()); //string '', as expected - also see next example

console.log(['stuff',{}].toString()); //stuff,[object Object]

答案 1 :(得分:0)

我不能给你一个完整的答案,但这里有一些观察:

如你所知,有一个Boolean函数返回一个布尔值,它接受一个参数,因此它非常类似于转换为bool。 Boolean([])会返回true,这解释了[] && truetrue![]为假且!![]为真的原因。

另一方面,Number([])构造函数返回0,这解释了为什么+[] && true为零。

另一件事是String([])是空字符串,String(true)是字符串"true""" && "true""",它完全符合我的大计划我会在下面看到。

现在,关于好奇的事情。这是我发现的:

Number(![])为0,Number([])也为0。在这种情况下,Number(![]) == Number([])显然是正确的。

Number([])为0,Number(false)为0,因此为Number([]) == Number(false)

在我看来,只要JS无法直接比较两个对象(两者都不是字符串),它就会将它们转换为数字,然后进行比较。如果其中一个是字符串,它总是转换为字符串,然后评估任何函数。至少这可以解释你注意到的奇怪行为。

答案 2 :(得分:0)

  

&& 如果可以转换为false,则返回expr1;除此以外,   返回expr2。因此,当与布尔值一起使用时,&&如果返回true   两个操作数都可以转换为true;否则,返回false。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators

在你的情况下

this.$$('#myElement')