为什么此代码的评估结果为:
10 + "10" => "1010"
"10" + 10 => "1010"
为什么不的工作原理如下:
10 + "10" => 20 // the number comes first
"10" + 10 => "1010" // the string comes first
编辑:
更具体地说,解释器的实现在哪里呢?或者,它是如何做到的?
答案 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的计算方法如下:
- 让lref成为评估AdditiveExpression的结果。
- 让lval成为GetValue(lref)。
- 让rref成为评估MultiplicativeExpression的结果。
- 让rval为GetValue(rref)。
- 让lprim为ToPrimitive(lval)。
- 让rprim为ToPrimitive(rval)。
- 如果Type(lprim)是String或Type(rprim)是String,那么 返回串联ToString(lprim)后跟ToString(rprim)的结果的字符串
- 将添加操作的结果返回到ToNumber(lprim)和ToNumber(rprim)。参见下面的注释11.6.3。
醇>
答案 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的工作原理