JavaScript:[]的奇怪布尔值

JavaScript:[]的奇怪布尔值,javascript,Javascript,我学习JavaScript已经有一段时间了,我知道不应该真正依赖这种行为,但我越来越好奇。。。为什么空数组[]具有看似冲突的布尔标识 它是真的:[]&&true计算为true…但它是假的:[]==false计算为true 然而,它的双重否定是正确的:!![]计算结果为true。但它(使用松散相等)也等于它自己的否定:![]=[]计算结果为true 其数值为falsy:+[]&&true计算结果为0 它的字符串表示形式是falsy:[] []是这样一个难题,有什么明确的原因吗?我认为结果是合理的。

我学习JavaScript已经有一段时间了,我知道不应该真正依赖这种行为,但我越来越好奇。。。为什么空数组
[]
具有看似冲突的布尔标识

它是真的:
[]&&true
计算为
true
…但它是假的:
[]==false
计算为
true

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

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

它的字符串表示形式是falsy:
[]


[]
是这样一个难题,有什么明确的原因吗?

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

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]

我不能给你一个完整的答案,但以下是一些观察结果:

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

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

就你而言

+[] // 0 - is falsy so it will be returned
[].toString() // "" - is falsy so it will be returned

但这并不能解释为什么会这样。例如,第一个为true,因为每个对象的计算结果都为true(布尔转换)。第二个:是的,它是空的,但是那里发生了什么。我认为false被转换为0。他没有特别问解释器是如何工作的,他只是问为什么
[]
的计算结果很奇怪。我建议这不是一个“难题”,结果是合理的。