2

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

它是真实的:[] && true计算结果为true...然而,它是错误的:[] == false计算结果为true

然而,它的双重否定是正确的:!![]计算结果为true. 但它也(使用松散相等)等于它自己的否定:![] == []计算为true.

它的数值是假的:+[] && true计算结果为0.

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

有什么明确的原因为什么[]会出现这样的难题?

4

3 回答 3

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 不能直接比较两个对象(两者都不是字符串)时,它会将它们转换为数字然后进行比较。如果其中一个是字符串,它总是转换为字符串,然后评估任何函数。至少这可以解释你注意到的奇怪行为。

于 2013-11-13T22:20:02.227 回答
0

我认为结果是合理的。我唯一不确定的是+[],但我可能已经弄清楚了。就像你说的,松散的比较可能会产生误导,但对我来说是有道理的。

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]
于 2013-11-13T22:10:36.360 回答
0

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

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

在你的情况下

+[] // 0 - is falsy so it will be returned
[].toString() // "" - is falsy so it will be returned
于 2016-02-08T15:25:05.853 回答