以下按预期打印'A',因为数据类型不同,因此数组被哄骗为原始形式,对于空数组为false
。
if ([] == false)
console.log('A');
else
console.log('B');
但是为什么下面的代码也打印'A'?
if ([])
console.log('A');
else
console.log('B');
答案 0 :(得分:7)
为什么
[] == false
为真
因为与原始值相比,数组的行为很奇怪。
特别是,当你compare布尔值为非布尔值时,布尔值作为数字处理。然后,当您将一个数字与一个对象进行比较时,该对象为converted to a primitive - 该数组stringifies之前再次将其与数字进行比较。现在,该字符串is converted to a number以便可以进行比较:
[] == false
[] == 0
"" == 0
0 == 0
同样,您可以尝试
[1] == true
[1] == 1
"1" == 1
1 == 1
或
[2] == true
[2] == 1
"2" == 1
2 == 1
但只有
[]
评估为真?
答案 1 :(得分:2)
由于这些equality rules:
,第一个测试返回true如果其中一个操作数是布尔值,则将布尔操作数转换为 如果为真则为1,如果为假则为+0。
如果将对象与数字或字符串进行比较,则JavaScript会尝试 返回对象的默认值。运营商试图 将对象转换为原始值,String或Number值, 使用对象的valueOf和toString方法。如果这样做 要转换对象失败,会生成运行时错误。
(是的,你确实有[].toString()==""
因此[]==0
)
第二次测试
if ([])
简单地传递,因为所有对象都是完整的。
答案 2 :(得分:2)
==
运算符强制进行类型转换。 []
布尔为false
。为什么不会发生同样的事情。 "a" == false
?基本上,[]
的数值为0
,而"a"
的数值为NaN
。可以预见,"0" == false
是true
:)
另一方面,在第二种情况下,您基本上只是检查[]
是否存在(“不为空”)。布尔值没有强制转换。
答案 3 :(得分:1)
[]
是一个空数组,与false
不同,这就是[] == false
返回false
WHILE []
返回true
的原因,因为它不是null
指向{{1}}