【问题标题】:Javascript addition and subtraction with a string valueJavascript与字符串值的加法和减法
【发布时间】:2014-04-08 04:37:51
【问题描述】:

我最近遇到了这个 typecast JS 问题:

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

为什么'11'-10 等于1,而不是别的什么?

【问题讨论】:

  • 因为- 除了减法之外没有其他操作可做,并且在执行其他任何操作之前,javascript 中的每个操作数都首先被视为一个数字

标签: javascript


【解决方案1】:

因为减法运算符没有歧义,并且只为数字定义。因此,两个操作数都先转换为数字。

见规范:

【讨论】:

    【解决方案2】:

    Here 是您问题的答案:

    上面写着

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

    检查链接上的String Operators 部分。

    【讨论】:

      【解决方案3】:

      我不是 JavaScript 专家,但您的问题提供了一个很好的机会来学习和阅读 ECMAScript specification。这是 5.1 版,所以它可以很好地解决这个问题。 Section 11.6.2 涵盖减法运算符:

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

      1. 设 lref 为 AdditiveExpression 的计算结果。
      2. 令 lval 为 GetValue(lref)。
      3. 令 rref 为 MultiplicativeExpression 的计算结果。
      4. 令 rval 为 GetValue(rref)。
      5. 设 lnum 为 ToNumber(lval)。
      6. 设 rnum 为 ToNumber(rval)。
      7. 返回对 lnum 和 rnum 进行减法运算的结果。

      所以,对于第 1 步:

      • 设 lref 为 AdditiveExpression 的计算结果。

      在您的情况下,这是评估“11”。我们有 lref = '11'。

      • 令 lval 为 GetValue(lref)。

      GetValue (V) 的第 1 行,如果 Type(V) 不是 Reference,则返回 V。因此,我们返回 '11'。

      我们有 lval = '11'。

      • 令 rref 为 MultiplicativeExpression 的计算结果。

      在你的情况下,即 10。我们有 rref = 10。

      • 令 rval 为 GetValue(rref)。

      同样,应用GetValue (V)的第1行,如果Type(V)不是Reference,则返回V。因此,我们返回10。

      我们有 rval = 10。

      • 设 lnum 为 ToNumber(lval)。

      lval = '11'。调用 ToNumber('11') 将遵循 ToNumber specification for Strings,案例 1。数字文字本身周围有可选的空格。由于您的示例没有空格,因此结果只是数字文字,即 11。

      我们有 lnum = 11。

      • 设 rnum 为 ToNumber(rval)。

      rval = 10。调用 ToNumber(10) 将遵循 ToNumber specification for Number。在这种情况下,输入参数本身会被返回,并且不会发生转换。这意味着我们返回 10。

      我们有 rnum = 10。

      • 返回对 lnum 和 rnum 进行减法运算的结果。

      再一次,根据规范:

      - 运算符在应用于两个数字类型的操作数时执行减法,产生其操作数的差;左操作数是被减数,右操作数是减数。给定数字操作数 a 和 b,总是 a–b 产生与 a +(–b) 相同的结果。

      我们有 rnum - lnum = 11 - 10 = 11 + (-10) = 1。

      【讨论】:

        【解决方案4】:

        因为+是一个运算符重载来联系一个字符串,而-运算符基本上不与字符串一起使用。

        使用- 字符串将转换为整数,在+ 情况下字符串将连接。

        【讨论】:

          【解决方案5】:

          在 JS 中+ 中也是连接运算符,所以如果第一个变量字符串那么concatenate operator 优先级高

          - 只是数学运算符,因此它为您提供减法结果。

          【讨论】:

            【解决方案6】:

            + 符号用于数字和字符串连接。因此,当它首先找到字符串时,它认为是两个字符串连接。您可以使用+ 前缀或Number 将字符串转换为数字

            - 符号用于减法,仅适用于数字。所以它会自动将字符串转换为数字。

            以下将解决您的问题

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

            【讨论】:

            • 这不是问题所在。
            【解决方案7】:

            '+' 运算符是唯一一个也用于连接字符串的空腔运算符。因此,当找到一个字符串和整数时,它充当连接运算符。所有其他的空气运算运算符,如 -、*、/ 仅用于计算,这就是为什么它们将所有内容都视为数字:

            '20' * 3= 60
            '20'/ 2= 10
            '20'-5= 15
            '20'+ 3 = '203'
            

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 2010-09-12
                • 1970-01-01
                • 2012-12-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多