使用字符串值进行Javascript加减运算

3

最近我遇到了一个关于JavaScript类型转换的问题:

给定'11'+10,答案是1110。很明显这不是21,因为其中一个是字符串,JavaScript会将两者都视为字符串并执行连接操作,而不是数学加法。

为什么'11'-10等于1,而不是其他值呢?


1
因为在JavaScript中,除了减法以外,没有其他与“-”相关的操作,并且每个操作数都被视为数字,然后才执行其他操作。 - Netorica
8个回答

2

因为减法运算符不会产生歧义,且仅适用于数字。因此,两个操作数首先被转换为数字。

请参阅规范:


2
以下是您要翻译的内容:

这里是你问题的答案:

它说:

如果数字和字符串之间有一个加号,则连接优先于加法。当一个操作数是字符串,另一个操作数是数字时,所有其他数字运算符都将尝试将字符串转换为数字。

请查看链接中的字符串运算符部分。

注:已保留HTML标签。

2
我不是JavaScript专家,但你的问题提供了一个很好的机会,可以从ECMAScript规范中学习和阅读。这是第5.1版,对于这个问题来说足够了。第11.6.2节涵盖了减法运算符:

产生式AdditiveExpression:AdditiveExpression - MultiplicativeExpression的计算如下:

  1. 将AdditiveExpression评估为lref。
  2. 让lval成为GetValue(lref)的结果。
  3. 将MultiplicativeExpression评估为rref。
  4. 让rval成为GetValue(rref)的结果。
  5. 将lnum转换为ToNumber(lval)。
  6. 将rnum转换为ToNumber(rval)。
  7. 返回将lnum和rnum应用于减法运算的结果。
因此,在步骤1中:
  • 将AdditiveExpression评估为lref。
在你的情况下,这是在评估'11'。我们有lref = '11'。
根据GetValue (V)的第1行,如果Type(V)不是Reference,则返回V。因此,我们返回'11'。
我们有lval = '11'。
在你的情况下,这是10。我们有rref = 10。
再次应用GetValue (V)的第1行,如果Type(V)不是Reference,则返回V。因此,我们返回10。
我们有rval = 10。
让lnum成为ToNumber(lval)。 lval = '11'。调用ToNumber('11')将遵循字符串的ToNumber规范,情况1。数值本身周围有可选的空格。由于您的示例没有空格,结果就是数字本身,即11。
我们有lnum = 11。
  • 让rnum成为ToNumber(rval)。
rval = 10。调用ToNumber(10)将遵循Number的ToNumber规范。在这种情况下,输入参数本身被返回,不进行转换。这意味着我们返回10。
我们有rnum = 10。
  • 返回将lnum和rnum应用减法运算的结果。
再次根据规范:
运算符“-”在对两个数字类型的操作数应用时执行减法,产生其操作数的差;左操作数是被减数,右操作数是减数。给定数字操作数a和b,总是有a-b产生与a+(-b)相同的结果。
我们有rnum-lnum = 11-10 = 11 + (-10) = 1。

1

+符号用于数字和字符串的连接。当它先找到字符串时,它会被视为两个字符串连接。您可以使用+前缀或Number将字符串转换为数字。

但是-符号仅适用于减法,并且仅适用于数字。因此,它会自动将字符串转换为数字。

以下内容将解决您的问题。

(+'11') + 10
(+'11') - 10

(or)

 Number('11') + 10
 Number('11') - 10

1
然而,这并不是问题的关键。 - Felix Kling

1
"'+' 操作符是唯一一个既用于算术运算又用于字符串连接的操作符。因此,当字符串和整数结合时,它会作为连接运算符。其他所有算术操作符,如 -、*、/,仅用于计算,因此它们将所有内容都视为数字。"
'20' * 3= 60
'20'/ 2= 10
'20'-5= 15
'20'+ 3 = '203'

1

加号 + 首先用于字符串连接(如果至少有一个操作数是字符串),在其他情况下用作数字算术加法。减号始终将操作数转换为数字。有关加法运算符的更多详细信息,请查看此文章


1
由于+是用于连接字符串的重载运算符,而-运算符不基本用于字符串。
使用-将字符串转换为整数,在+情况下,字符串将被连接。

1
在JS中,+也是连接运算符,因此如果第一个变量为字符串,则连接运算符的优先级较高。 -只是数学运算符,因此它提供了减法结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接