2011-01-23 54 views

回答

11

+concatenation operator导致0toString评估。

因为a的值是"0",而b的值是0

的ECMAScript 11.6.1加法运算符(+)

加法运算或者执行字符串连接或数字加法。生产AdditiveExpression:

  1. 令LREF是评估AdditiveExpression的结果:AdditiveExpression + MultiplicativeExpression如下评价。

  2. 让lval成为GetValue(lref)。

  3. 让rref是评估乘法表达式的结果。

  4. 设rval为GetValue(rref)。

  5. 让lprim ToPrimitive(lval)。

  6. 设rprim为ToPrimitive(rval)。

  7. 如果Type(lprim)是字符串或类型(rprim)是字符串,然后

    一个。返回串联ToString(lprim)后跟ToString(rprim)的字符串

  8. 返回对ToNumber(lprim)和ToNumber(rprim)应用加法运算的结果。请参阅下面的注释 11.6.3。

注1没有暗示设置在调用ToPrimitive在步骤5个6除日期对象中的所有天然的ECMAScript对象处理没有一个提示的仿佛暗示编号给予;日期对象处理缺少提示,就像提供了提示字符串一样。主机对象可能会以其他方式处理缺少提示。

注2步骤7不同于关系运算符(11.8.5)的比较算法的步骤3,通过使用逻辑或操作而不是逻辑和操作。

3

[] + 0是一个字符串。
当您在Javascript中编写a + b时,引擎会将ab转换为原语。
如果至少有一个生成的基元是一个字符串,它将执行字符串连接;否则,它将执行数字加法。

要将对象(如数组)转换为基元,引擎将调用valueOf(),如果其结果不是基元,则将调用toString()
对于数组,valueOf()返回原始数组(不是原语),toString()返回数组内容的以逗号分隔的字符串。因此,[] + 0变成"" + 0,即"0"

非空字符串永远不会是错的。

相关问题