【问题标题】:About "5"-1 & "5"+1 in Javascript (plus and minus signs) [duplicate]关于Javascript中的“5”-1和“5”+1(加号和减号)[重复]
【发布时间】:2015-08-09 03:25:28
【问题描述】:

我读过一本关于 Javascript 运算符的书,这让我很困惑。

console.log("5"+1);

这将使“5”成为一个字符串。所以结果是51

console.log("5"-1);

这个结果将是4。我知道它会将"5" 转换为5,但为什么它没有将undefined 显示为“字符串减数字”?

更新:那么其他语言呢?限制更多吗?

【问题讨论】:

  • 因为这是 JavaScript 规范定义它应该实现的方式。
  • 这个问题其实是个dup:见stackoverflow.com/questions/24383788/…
  • 和 "4" * "10" = 40。
  • @ryenus 当时我没有关键字。 :) 我认为下面的答案很棒。

标签: javascript add date-arithmetic


【解决方案1】:

遗憾的是,JavaScript 在早期就有望借助 Java 的成功进行推广,而在 Java 使用之后,string 连接的 plus 就被采用了。 p>

所以 JavaScript 会努力将字符串强制转换为数字,它确实如此,只是加号被用于字符串,所以......好吧......

虽然 Javascript 有很多优点,但它是在 10 天内完成的,并且有很多像这样的搞笑方面,请查看 comedy gold

【讨论】:

    【解决方案2】:

    + 是一个运算符,在数字相加时表示 SUM,在使用字符串时表示 CONCATENATE。

    由于第一个是字符串,它将继续连接一个“5”+toString(1)。

    由于 MINUS (-) 运算符不能与 String 一起使用,您将得到未定义。

    如果你想使用 MINUS 运算符,你需要这样做:

    parseInt("5") -> It will give you 5, the number
    parseInt("5")-1 = 4
    "5"+1 = 51
    parseInt("5")+1 = 6
    

    希望对你有帮助

    【讨论】:

    • 因此使用 parseInt() 会将字符串转换为数字。这有点像 Number()。
    • 将转换为整数。 parseFloat 将转换为 float...
    【解决方案3】:

    因为当我们使用“+”时,它可以以两种不同的方式使用:-
    1. 作为数学运算符。
    2. 连接字符串

    但 '-' 只能用作数学运算符。
    因此 javascript 在 '-' 的情况下将 '5' 视为数字,而在 '+' 的情况下将 '5' 视为字符串。

    【讨论】:

      【解决方案4】:

      在javascript中(+)操作符的操作方式如下所述

      • 3+true 将返回 4 ,数字和布尔值之间的 (+) 运算符或两个布尔值会将布尔值转换为数字,因此 true 转换为 1,因此结果为 4
      • "2"+true 将返回 "2true" ,如果其中一个操作数是字符串,它会将另一个操作数(数字或布尔值)转换为字符串并处理连接
      • -"12"+3 将返回 -9 ,字符串前面的 (-) 运算符会将字符串转换为数字并将其变为 -12 并返回 -9

      【讨论】:

        【解决方案5】:

        根据标准 EcmaScript 262。+- 运算符在涉及字符串时表现不同。第一个将每个值转换为字符串。第二个将每个值转换为数字。

        来自标准:

        如果 Type(lprim) 是 String 或 Type(rprim) 是 String,则返回 作为连接 ToString(lprim) 后跟的结果的字符串 ToString(rprim)

        该规则意味着如果表达式中有字符串值,则+ 操作中涉及的所有值都将转换为字符串。在 JavaScript 中,当 + 运算符与字符串一起使用时,它会将它们连接起来。这就是console.log("5"+1) 返回“51”的原因。 1 转换为字符串,然后将 "5" + "1" 连接在一起。

        不过,上述规则不适用于- 运算符。当您使用- 时,所有值都会根据标准转换为数字(见下文)。因此,在这种情况下,"5" 转换为5,然后减去1

        来自标准:

        5 令 lnum 为 ToNumber(lval)。

        6 设 rnum 为 ToNumber(rval)。


        来自标准 EcmaScript 262 的运算符定义。

        接线员+http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.1

        操作员-http://www.ecma-international.org/ecma-262/5.1/#sec-11.6.2

        【讨论】:

          【解决方案6】:

          由于类型强制以及它在 JavaScript 中的一致性,在第二种情况下,"5" 被转换为数字5,并从中减去1,得到4 .

          【讨论】:

            【解决方案7】:

            "5" 可以强制为 5(整数)。这就是为什么你得到 4 作为输出。 但是,如果您尝试:

            console.log("text" - 1);
            

            文本不能强制,输出为NaN

            【讨论】:

              【解决方案8】:

              减法运算符 (-) 将运算符右侧的数字从左侧的数字中减去。

              当任一操作数是字符串时,会尝试将字符串转换为数字。 如果您尝试使用 console.log("abc" - 1); 而不是使用 "5"会提示错误为 NaN。

              仅供参考: 减法运算符有特殊的规则来处理 JavaScript 中存在的各种类型转换:

              如果两个操作数是数字,执行算术减法并返回结果。

              如果任一数字为 NaN,则结果为 NaN。

              如果从 Infinity 中减去 Infinity,则结果为 NaN。

              如果从-Infinity 中减去-Infinity,则结果为NaN。

              如果从 Infinity 中减去 –Infinity,则结果为 Infinity。

              如果从 -Infinity 中减去 Infinity,则结果是 -Infinity。

              如果+0减去+0,结果就是+0。

              如果从 +0 中减去 –0,则结果为 –0。

              如果从 –0 中减去 –0,则结果为 +0。

              如果两个操作数中的任何一个不是数字,则结果为 NaN。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2022-10-13
                • 2019-01-17
                • 1970-01-01
                • 1970-01-01
                • 2018-02-22
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多