有人可以在javascript中解释这种行为吗?

时间:2011-01-23 02:50:11

标签: javascript casting

在Firefox中测试:

a = [] + 0;
b = 0;

alert(a); // 0
alert(b); // 0

alert(!a); // false
alert(!b); // true

2 个答案:

答案 0 :(得分:11)

+ concatenation operator会导致对toString进行0评估。

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

来自 ECMAScript 11.6.1加法运算符(+)

  

加法运算符执行字符串连接或数字加法。生产AdditiveExpression:AdditiveExpression + MultiplicativeExpression的计算方法如下:

     
      
  1. 让lref成为评估AdditiveExpression的结果。

  2.   
  3. 让lval成为GetValue(lref)。

  4.   
  5. 让rref成为评估MultiplicativeExpression的结果。

  6.   
  7. 让rval为GetValue(rref)。

  8.   
  9. 让lprim为ToPrimitive(lval)。

  10.   
  11. 让rprim为ToPrimitive(rval)。

  12.   
  13. 如果Type(lprim)是String或Type(rprim)是String,那么

         

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

  14.   
  15. 将添加操作的结果返回到ToNumber(lprim)和ToNumber(rprim)。见   请注意以下11.6.3。

  16.         

    注1:在步骤5和6中对ToPrimitive的调用中没有提供提示。除Date对象之外的所有本机ECMAScript对象都处理没有提示,就像提供了提示号一样;日期对象处理缺少提示,就像提供了提示字符串一样。主机对象可以通过其他方式处理缺少提示。

         

    注2:步骤7与关系运算符(11.8.5)的比较算法的步骤3的不同之处在于,使用逻辑运算而不是逻辑运算。

答案 1 :(得分:3)

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

要将对象(例如数组)转换为基元,引擎将调用valueOf(),如果其结果不是基元,则会调用toString()
对于数组,valueOf()返回原始数组(不是原始数组),toString()返回数组内容的逗号分隔字符串。

因此,[] + 0变为"" + 0,即"0"

非空字符串绝不是假的。