36

我正在阅读MDN 上对 JavaScript 的重新介绍,在Numbers部分中它说您可以通过在字符串前面添加一个加号运算符来将字符串转换为数字。

例如:

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

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

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

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

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

4

8 回答 8

50

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

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

> 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
于 2013-05-13T13:00:02.070 回答
6

您还可以使用 parseInt() 或 parseFloat(),如下所示:

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

我认为这比使用+“3”要干净得多,但这只是我的看法。

于 2013-05-13T13:02:24.303 回答
4

The answer can be found in Ecma262.pdf section 11.6.1:

If Type(lprim) is String or Type(rprim) is String, then a. Return the String that is the result of concatenating ToString( lprim) followed by ToString(rprim).

So that will resolve all operations according to precedence, so that as soon the string is found any number, the number is converted to string.

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

To read the whole standard, go here.

于 2013-05-13T13:07:36.897 回答
3

当您查看 ES5 规范中的加法运算符 ( + ) (§11.6.1) 中的步骤 7 和“注 2”时,

它说

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


注 2:第 7 步与关系运算符(11.8.5)比较算法的第 3 步的不同之处在于使用逻辑或运算而不是逻辑与运算。

这意味着如果7( 3+4) "5"( ||not&& )typeof "string" toString()应用于两个操作数。

所以加法实际上适用于

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

于 2013-05-13T13:42:17.920 回答
2

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

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

这总是很好。

1 + (+"2") = 3

因为在字符串之前放置 + 会将字符串变量转换为数字。

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

于 2014-09-03T02:58:54.937 回答
1

When you add a number and a string in Javascript the result is always a string.

Check the experiment here - 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
于 2013-05-13T13:07:13.033 回答
1

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

于 2013-05-13T13:03:16.340 回答
0

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

4+"3" = "43"

4-"3" = 1

于 2019-10-22T09:59:28.600 回答