【问题标题】:JavaScript adding a string to a numberJavaScript 将字符串添加到数字
【发布时间】:2013-05-07 12:31:53
【问题描述】:

我正在阅读re-introduction to JavaScript on MDN,在 Numbers 部分中它说您可以通过在字符串前面添加一个加号运算符来将字符串转换为数字。

例如:

+"42" 这将产生 42 的数字输出。

但是在关于 Operators 的部分中进一步说,通过将字符串“某物”添加到任何数字,您可以将该数字转换为字符串。他们还提供了以下让我感到困惑的示例:

"3" + 4 + 5 大概会在输出中产生一个 345 的字符串,因为数字 4 和 5 也会被转换为字符串。

但是,3 + 4 + "5" 不会产生数字 12 而不是他们示例中所述的字符串 75?

在关于运算符部分的第二个示例中,位于字符串“5”前面的 + 运算符不会将该字符串转换为数字 5,然后将所有内容相加到等于 12 吗?

【问题讨论】:

标签: javascript string numbers operators


【解决方案1】:

您所说的是一元加号。它不同于用于字符串连接或加法的加号。

如果您想使用一元加号进行转换并将其添加到先前的值,则需要加倍。

> 3 + 4 + "5"
"75"
> 3 + 4 + +"5"
12

编辑:

您需要了解操作顺序:

+- 具有相同的优先级,并关联到左侧:

 > 4 - 3 + 5
 (4 - 3) + 5
 1 + 5
 6

+ 再次向左关联:

> 3 + 4 + "5"
(3 + 4) + "5"
7 + "5"
75

一元运算符的优先级通常高于二元运算符:

> 3 + 4 + +"5"
(3 + 4) + (+"5")
7 + (+"5")
7 + 5
12

【讨论】:

  • 所以这是否意味着当一个字符串与其他数字组合时,它会将所有其他数字转换为字符串,除非我特别在它前面放置另一个 + 运算符(本质上是两个 + 运算符(+ + "5 ")) 然后并且只有这样,JavaScript 才会将字符串中的内容解释为数字?
  • @SineLaboreNihil In (+ + "5")) 第一个用于add 第二个用于将"5" 字符串类型化为5 int ..阅读链接
  • @epascarello 我得到了操作的顺序我只是被 MDN 网站上的以下句子弄糊涂了:“如果你将字符串添加到数字(或其他值),所有内容都首先转换为字符串。”它没有说明转换的顺序。此外,以下句子增加了混乱:“将空字符串添加到某物是一种有用的转换方式。”它并不是说只有在被 JavaScript 检测为字符串之后才会将所有内容转换为字符串,并且之前的所有内容都将保持不变。不管怎样,谢谢你的帮助。
  • 减号,另一方面并不那么特别。所以"2" - 1 返回1,但"2" + -1 返回"2-1"。调试你的心! :P
  • @poshest - 实际上,"unary -" 的行为与 "unary +" 完全相同。 "2" + +1 会将数字 +1 转换为字符串(因此是 "1"),然后连接两个字符串。您的示例将数字-1 转换为字符串(因此"-1"),然后连接两个字符串。这是相当一致的。
【解决方案2】:

你也可以使用 parseInt() 或 parseFloat(),像这样:

> 1 + 2 + "3"
"33"
> 1 + 2 + parseInt(3)
6

我认为这比使用 +"3" 更简洁,但这只是我的看法。

【讨论】:

    【解决方案3】:

    答案可以在 Ecma262.pdf 第 11.6.1 节找到:

    如果 Type(lprim) 是 String 或 Type(rprim) 是 String,那么 a.返回 作为连接 ToString(lprim) 后的结果的字符串 通过 ToString(rprim)。

    这样会按照优先级解析所有的操作,这样只要找到字符串中的任意数字,就会将该数字转换为字符串。

    4 + 3 + "5"
    "75"
    4 + 3 + "5" + 3
    "753"
    

    要阅读整个标准,请转至here

    【讨论】:

      【解决方案4】:

      当您查看 ES5 规范中的第 7 步和 The Addition operator ( + ) (§11.6.1) 处的“注 2”时,

      它说

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


      注意 2 第 7 步与关系运算符 (11.8.5) 的比较算法的第 3 步不同,它使用逻辑或运算而不是逻辑与运算。

      如果7 (3+4) "5" (|| 不是&&) 是typeof "string" toString() 的意思两个操作数。

      所以加法实际上是应用于

      "7""5" -> "7" + "5" //"75"

      【讨论】:

        【解决方案5】:

        javascript中的简单+运算符用于连接而不是添加。

        字符串格式整数变量之前的括号和 + 运算符每次都可以完成这项工作。

        这总是很好。

        1 + (+"2") = 3
        

        因为在字符串前面加上 + 会将字符串变量转换为数字。

        在这里提琴:http://jsfiddle.net/xuVur/2/

        【讨论】:

          【解决方案6】:

          在 3 + 4 + "5" 的示例中 - Javascript 解析器将执行 (3+4)+"5",因为 3+4 是第一个 - 所以它将添加 3 + 4,因为它们是数字,然后连接字符串“5”。

          【讨论】:

          • 这让我感到困惑,我将它粘贴在这里,因为它是在 MDN 网站上写的:“如果您将字符串添加到数字(或其他值),所有内容都将转换为字符串首先。”......所以显然这只有在你先添加一个字符串时才有效,在数字之前。如果您在数字之后添加它,数字将相加(简单数学),然后将一个字符串连接到它。这意味着在这种情况下,所有内容都不会转换为字符串。
          • 技术上不正确,因为虽然 Javascript 没有键入,但它仍然会保留类型,除非您转换,例如 int->string, string->int。
          【解决方案7】:

          当你在 Javascript 中添加一个数字和一个字符串时,结果总是一个字符串。

          在这里查看实验 - http://jsfiddle.net/xuVur/1/

          var a = "3" + 4 + 5;
          var b = 3 + 4 + "5";
          
          $("#result1").html(a); // prints 345
          $("#result2").html(b); //prints 75
          

          【讨论】:

          • 您总是在打印a
          • 我的错。我现在改了。
          【解决方案8】:

          这很令人困惑,但二进制 + 似乎是一种将数字强制转换为字符串的罕见情况。在大多数情况下,情况正好相反(因此很容易认为您不需要对类型过于挑剔)

          4+"3" = "43"

          4-"3" = 1

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-08-10
            • 1970-01-01
            • 1970-01-01
            • 2014-11-29
            • 2020-02-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多