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

Har*_*iya 6 javascript

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

请检查示例.

+[] == 0 ? alert(true) : alert(false);
Run Code Online (Sandbox Code Playgroud)

并检查. '1+[+[]]'输出'10'

Raj*_*amy 8

它将如下评估,

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"


Dmi*_*tin 5

JavaScript以+[] == 0这种方式评估:

  1. + []:+运算符尝试将操作数转换[]为原始值.
  2. + []:[]使用toString()method 转换为字符串,该方法是别名[].join(',').结果是一个空字符串''
  3. + '':空字符串转换为数字:Number('')- >0
  4. + 00
  5. 最后评估比较:+[] == 0- > 0 == 0- >true

'1+[+[]]'评价:

  1. 1 + [ +[] ](变换[]成原始:'')
  2. 1 + [ + '' ](变换''成数:0)
  3. 1 + [ + 0 ](+ 00)
  4. 1 + [ 0 ](加法运算符强制转换[0]为原始值:[0].toString()- > [0].join(',')- > '0')
  5. 1 + '0'(由于第二操作数'0'是一个字符串,变换所述第一数目1为字符串太:'1')
  6. '1' + '0' (简单字符串连接)
  7. '10'

另请阅读本文关于加法运算符的内容.