我一直在学习JavaScript已经有一段时间了,我知道最好不要实际依赖这种行为,但我很好奇......为什么空数组[]
看似有冲突的布尔标识?
这是真实的:[] && true
评估为true
...然而,它是错误的:[] == false
评估为true
。
然而,它的双重否定是正确的:!![]
评估为true
。但它也(使用松散的平等)等于它自己的否定:![] == []
评估为true
。
其数值为falsy:+[] && true
的计算结果为0
。
它的字符串表示是假的:[].toString() && true
计算结果为""
。
有[]
这样一个难题的明确原因吗?
答案 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
,这解释了[] && true
为true
,![]
为假且!![]
为真的原因。
另一方面,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')