为什么JavaScript在添加字符串和数字时会转换为字符串?

时间:2013-01-30 04:47:58

标签: javascript types type-conversion

为什么此代码的评估结果为:

10 + "10" => "1010"
"10" + 10 => "1010"

为什么的工作原理如下:

10 + "10" => 20 // the number comes first
"10" + 10 => "1010" // the string comes first   

编辑:

更具体地说,解释器的实现在哪里呢?或者,它是如何做到的?

4 个答案:

答案 0 :(得分:3)

+是一个连接运算符,也是Javascript中的算术运算符。如果它发现在字符串和数字之间使用了运算符,那么如果你对两个整数使用运算符,那么它会将该数字连接到字符串else中,那么结果也将是整数。

所以,

STRING + STRING = STRING

STRING + INTEGER = STRING

INTEGER + STRING = STRING

INTEGER + INTEGER = INTEGER

答案 1 :(得分:3)

ECMAScript 262 Specification编码JavaScript语言(JavaScript实际上是ECMAScript的Mozilla实现)。在任何情况下,Annotated ES5中相对容易找到的东西,我通常都会参考。

请参阅11.6.1 The Addition operator ( + )

  

加法运算符可以执行字符串连接或数字加法。

     

生产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.   

答案 2 :(得分:2)

在比较具有不同类型的值时,JavaScript会使用复杂且令人困惑的规则集。通常,它只是尝试将其中一个值转换为另一个值的类型(我们可以在您的问题中看到)。这通常被称为自动类型转换。

让我们来看看你的代码:

 10 + "10" => "1010"
"10" + 10 => "1010"

在JavaScript中,如果将任何非字符串值添加到字符串中,则在连接之前,该值会自动转换为字符串。因此,无论整数或字符串值的顺序如何,JavaScript都将任何整数视为字符串。

但是,您应该知道JavaScript不会将此应用于所有算术运算符。例如,如果我们要乘以我们的值,我们会得到:

 10 * "10" => 100
 "10" * 10 => 100
 "ten" * 10 => NaN

现在,为什么Javascript会这样做?好吧,你可以说它是为了方便起见。有许多实例可能需要将两个值连接成一个字符串。相反,你永远不能将一个整数与一个字符串相乘,我们可以在上面的例子中看到。

答案 3 :(得分:1)

不幸的是,这就是Javascript的工作原理