if([] == false) alert('empty array is false');
alert(+[]) // alert 0
if([]) alert('empty array is true');
他们都将运行警报
答案 0 :(得分:18)
这是因为==
(相等)运算符的类型强制。
空数组被认为是真实的(就像空对象一样),因此会调用第二个警报。
但是,如果使用([] == false)
,则会将数组强制转换为其字符串表示形式* ""
,然后将其视为falsy value,这会使条件成立,从而触发第一个提醒。
如果你想避免类型强制,你必须使用===
(身份)运算符作为首选,并使用着名的Douglas Crockford推广方式在javascript中进行比较。
您可以在此exhaustive answer中详细了解该问题。
* (在其上调用Object.prototype.toString
)
编辑: 有趣的JS比较:
NaN == false // false
NaN == true // also false
NaN == NaN // false
if(NaN) // false
if(!NaN) // true
0 == '0' // true
'' == 0 // true
'' == '0' // false !
由于bfavarettos答案中提到的奇怪规则,这显示了与==
比较的真正“力量”。
答案 1 :(得分:18)
这里的当前答案都是正确的,但我想根据language specification添加更严格的解释。结果显然相互矛盾的原因是if
语句和相等比较的评估方式不同。
对于if(expression)
语句,将评估表达式,然后将其转换为布尔类型(§ 12.5)。数组是对象,当Object转换为Boolean时,结果始终为true
(§ 9.2)。
与==
的平等比较遵循一套不同的规则,详见§ 11.9.3。比较可能需要多次类型转换,直到两个操作数都是相同的类型。操作数的顺序也很重要。根据该算法,我们可以看到比较[] == false
实际上是一个四步操作:
答案 2 :(得分:3)
将值评估为布尔值,并将其与true
或false
进行比较之间存在差异。
使用==
运算符时,将转换值以使类型对应。 []
值转换为空字符串""
,然后将其转换为布尔值,得到false
,因此[] == false
变为真。
将[]
评估为布尔值将返回true
,因为它不是'falsy'值,即0
,false
,null
, ""
,NaN
或undefined
。