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

Jon*_* M. 14 javascript boolean

if([] == false) alert('empty array is false');
alert(+[]) // alert 0
if([]) alert('empty array is true');
Run Code Online (Sandbox Code Playgroud)

他们都将运行警报

演示

Chr*_*oph 18

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

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

但是,如果使用,则会([] == false)将数组强制转换为其字符串表示形式*,""然后将其视为假值,这会使条件成立,从而触发第一个警报.

如果你想避免类型强制,你必须使用===(标识)运算符,这是首选和着名的道格拉斯克罗克福德推广方式在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 !
Run Code Online (Sandbox Code Playgroud)

==由于bfavarettos答案中提到的奇怪规则,这向您展示了比较的真正"力量" .

  • @Lightness好吧,我不是母语人士,所以这可能没有完全合理意义,我想说的是你可能需要为自己评估他非常有说服力的意见. (2认同)

bfa*_*tto 18

这里的两个当前答案都是正确的,但我想根据语言规范添加更严格的解释.结果明显矛盾的原因是对if陈述和平等比较的评价不同.

if(expression)语句的情况下,表达式被计算,然后转换为布尔类型(第12.5节).数组是对象,当Object转换为Boolean时,结果总是true(第9.2节).

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

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

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

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

    0 == 0
    
    Run Code Online (Sandbox Code Playgroud)
  4. 现在我们有两个数字,比较true根据步骤1.c.iii 进行评估.