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

他们都会发出警报

演示

4

3 回答 3

18

这是因为==(平等)运算符的类型强制。

一个空数组被认为是真实的(就像一个空对象一样),因此调用了第二个警报。

但是,如果您使用([] == false),则您的数组将被强制转换为它的字符串表示*,""这被认为是一个虚假值,这使得条件为真,从而也触发了第一个警报。

如果你想避免类型强制,你必须使用===(identity) 运算符,这是首选的并且由著名的Douglas Crockford推广的方式在 javascript 中进行比较。

您可以在这个详尽的答案中阅读更多关于该问题的信息。

* 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 答案中提到的奇怪规则,这向您展示了比较的真正“力量” 。

于 2012-12-10T11:00:30.057 回答
18

这里的两个当前答案都是正确的,但我想根据语言规范添加更详细的解释。明显矛盾的结果的原因是if陈述和相等比较的评估方式不同。

if(expression)语句的情况下,表达式被求值,然后转换为布尔类型(第 12.5 节)。数组是对象,当一个对象转换为布尔值时,结果总是true第 9.2 节)。

平等比较==遵循一组不同的规则,详见第 11.9.3 节。比较可能需要多次类型转换,直到两个操作数都是相同的类型。操作数的顺序也很重要。根据该算法,我们可以看到比较[] == false实际上是一个四步操作:

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

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

    "" == 0
    
  3. 将字符串与数字进行比较时,首先将字符串转换为数字(第 5 步,遵循第 9.3.1 节中描述的规则):

    0 == 0
    
  4. Now that we have two Numbers, the comparison evaluates to true according to step 1.c.iii.
于 2012-12-10T13:01:01.387 回答
3

true将值评估为布尔值与将其与or进行比较是有区别的false

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

评估[]为布尔值将返回true,因为它不是“假”值,即0falsenull、或。""NaNundefined

于 2012-12-10T11:01:57.170 回答