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