在JavaScript中使用+ +时的奇怪行为

Ion*_*zău 5 javascript string concatenation

每个人都知道JavaScript中两个字符串的基本连接:

> "Hello " + "World!"
'Hello World!'
Run Code Online (Sandbox Code Playgroud)

但是,如果我们使用+ +而不是+?我刚刚遇到了以下奇怪的行为:

> "Hello " + + "World!"
'Hello NaN'
> "Hello " + + ""
'Hello 0'
Run Code Online (Sandbox Code Playgroud)

从上面的例子中,我可以看到第二个字符串被转换为数字.因此,传递具有valueOf属性作为函数的对象,将转换该函数返回的值.

> "Hello " + + ({valueOf: function () {return 1; }})
'Hello 1'
Run Code Online (Sandbox Code Playgroud)

正如所料,它表明"Hello 1".


为什么第二个字符串被转换Number?为什么不抛出语法错误呢?

Den*_*ret 3

第二个+一元加运算符,其目的是将其操作数转换为数字。

一元加运算符位于其操作数之前并计算其操作数,但尝试将其转换为数字(如果尚未转换为数字)。尽管一元否定 (-) 也可以转换非数字,但一元加是将某些内容转换为数字的最快且首选的方式,因为它不对数字执行任何其他操作。它可以转换整数和浮点数的字符串表示形式,以及非字符串值 true、false 和 null。支持十进制和十六进制(“0x”前缀)格式的整数。支持负数(但不支持十六进制)。如果它无法解析特定值,它将计算为 NaN。

"Hello " + + "World!"
Run Code Online (Sandbox Code Playgroud)

只能解析为

"Hello " + (+ "World!")
Run Code Online (Sandbox Code Playgroud)

这是

"Hello " + NaN
Run Code Online (Sandbox Code Playgroud)

因此你的结果。

这个一元运算符在 JavaScript 中非常有用,并且是将数字或字符串转换为数字的最常见方法之一。它还有一个优点,parseFloat那就是它的容忍度不高(parseFloat("7up")会返回7),这使得它成为一种简单的方法来查看字符串是否是数字的表示(只需测试s==+s)。