为什么在javascript中[] == false时验证([])?

时间:2012-12-10 10:52:45

标签: javascript boolean

if([] == false) alert('empty array is false');
alert(+[]) // alert 0
if([]) alert('empty array is true');

他们都将运行警报

Demo

3 个答案:

答案 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实际上是一个四步操作:

  1. 涉及布尔值,因此首先将其转换为数字(算法的第7步)。所以它变成了:

    [] == 0
    
  2. 然后将数组转换为其原始值(请参阅§ 9.1§ 8.12.8),并变为空字符串(步骤9)。所以:

    "" == 0
    
  3. 将String与Number进行比较时,String首先转换为Number(步骤5,遵循§ 9.3.1中描述的规则):

    0 == 0
    
  4. 现在我们有两个数字,根据步骤1.c.iii,比较评估为true

答案 2 :(得分:3)

将值评估为布尔值,并将其与truefalse进行比较之间存在差异。

使用==运算符时,将转换值以使类型对应。 []值转换为空字符串"",然后将其转换为布尔值,得到false,因此[] == false变为真。

[]评估为布尔值将返回true,因为它不是'falsy'值,即0falsenull""NaNundefined