在Javascript中解释为什么’+ [] == 0’输出’true’?

Explain why '+[] == 0' output 'true' in Javascript?

本问题已经有最佳答案,请猛点这里访问。

解释为什么+[] == 0在javascript中输出"true"?

请检查示例。

1
+[] == 0 ? alert(true) : alert(false);

还要检查一下。'1+[+[]]'给出输出'10'


评估如下:

1:+[] == 0->+"" == 0

操作员+的优先级高于==,因此将首先对其进行评估。因此,在将数组转换为数字的过程中,将通过将其作为参数传递来调用ToPrimitive()函数。由于[]object字符串,它将返回""字符串。

2:+"" == 0->0 == 0

空字符串将转换为0。我们都知道,非空字符串将转换为NaN

3:0 == 0->true

最后,根据抽象的等式比较算法,当同一类型的两个操作数进行比较时,不会再进行进一步的计算,直接检查其相等性并返回结果。

在你的第二个案例中,1+[+[]]会发生如下的评估:

1:1+[+[]](+[]将首先转换为原语,因为[]是一个对象)

2:1+[+""](toPrimitive([])"")

3:1+[0](当您将空字符串转换为数字时,将生成0)

4:1+"0"(toPrimitive([0])"0")

5:"10"


javascript通过以下方式对+[] == 0进行评估:

  • + []+运算符试图将操作数[]转换为原始值。
  • + []:使用toString()方法将[]转换为字符串,该方法是[].join(',')的别名。结果是一个空字符串''
  • + '':空字符串转换成数字:Number('')->0
  • + 0变为0
  • 最后进行比较:+[] == 0->0 == 0->true
  • '1+[+[]]'评价:

  • 1 + [ +[] ](把[]转换成原语:'')
  • 1 + [ + '' ](将''转换成数字:0)
  • 1 + [ + 0 ](+ 00)
  • 1 + [ 0 ](加法运算符强制[0]转换为原值:[0].toString()->[0].join(',')->'0')
  • 1 + '0'(因为第二个操作数'0'是字符串,所以把第一个数1也转换成字符串:'1')
  • '1' + '0'(简单字符串连接)
  • '10'
  • 另请阅读本文中有关加法运算符的内容。