为什么`[] == false`为真,但只有`[]`的计算结果为真?

时间:2014-03-06 17:05:12

标签: javascript

以下按预期打印'A',因为数据类型不同,因此数组被哄骗为原始形式,对于空数组为false

if ([] == false)
    console.log('A');
else
    console.log('B');

但是为什么下面的代码也打印'A'?

if ([])
    console.log('A');
else
    console.log('B');

4 个答案:

答案 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
  

但只有[]评估为真?

因为any object is truthy

答案 1 :(得分:2)

由于这些equality rules

,第一个测试返回true
  

如果其中一个操作数是布尔值,则将布尔操作数转换为   如果为真则为1,如果为假则为+0。

     

如果将对象与数字或字符串进行比较,则JavaScript会尝试   返回对象的默认值。运营商试图   将对象转换为原始值,String或Number值,   使用对象的valueOf和toString方法。如果这样做   要转换对象失败,会生成运行时错误。

(是的,你确实有[].toString()==""因此[]==0

第二次测试

if ([])
简单地传递,因为所有对象都是完整的。

答案 2 :(得分:2)

==运算符强制进行类型转换。 []布尔为false。为什么不会发生同样的事情。 "a" == false?基本上,[]的数值为0,而"a"的数值为NaN。可以预见,"0" == falsetrue :)

另一方面,在第二种情况下,您基本上只是检查[]是否存在(“不为空”)。布尔值没有强制转换。

答案 3 :(得分:1)

[]是一个空数组,与false不同,这就是[] == false返回false WHILE []返回true的原因,因为它不是null指向{{1}}

相关问题