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

时间:2014-08-27 17:54:04

标签: javascript string concatenation

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

> "Hello " + "World!"
'Hello World!'

但如果我们使用+ +代替+会怎样?我刚刚遇到了以下奇怪的行为:

> "Hello " + + "World!"
'Hello NaN'
> "Hello " + + ""
'Hello 0'

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

> "Hello " + + ({valueOf: function () {return 1; }})
'Hello 1'

正如所料,它显示"Hello 1"


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

3 个答案:

答案 0 :(得分:3)

第二个+unary plus operator,其目的是将其操作数转换为数字。

  

一元加号运算符在其操作数之前,并计算其值   操作数但尝试将其转换为数字,如果不是   已经。虽然一元否定( - )也可以转换非数字,   unary plus是转换内容的最快和首选方式   变成一个数字,因为它不执行任何其他操作   数。它可以转换整数和浮点数的字符串表示,   以及非字符串值true,false和null。整数   支持十进制和十六进制(“0x” - 前缀)格式。   支持负数(但不支持十六进制)。如果不能   解析一个特定的值,它将评估为NaN。

"Hello " + + "World!"

只能解析为

"Hello " + (+ "World!")

"Hello " + NaN

因此你的结果。

这个一元运算符在JavaScript中非常有用,并且是从可能是数字或字符串转换为数字的最常用方法之一。它还具有优于parseFloat的优势,它不是可笑的宽容(parseFloat("7up")将返回7),这使得查看字符串是否是数字的表示是一种简单的方法(只是测试s==+s)。

答案 1 :(得分:2)

好问题。这是因为JavaScript具有一元+运算符(类似于一元-,例如,-1,它被解析为- (1)):https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Unary_plus_(.2B)

因此"foo" + + "bar"被解析为"foo" + (+ "bar")(或者如果您更喜欢lisp风格的解析树:(+ "foo" (+ "bar"))。

一元+将其操作数转换为数字,如果操作数不是一个合理的数字,则转换为NaN

> +"42"
42
> +"foo"
NaN

最后,在字符串中添加一个数字(包括NaN)会导致字符串连接。

因此"foo" + +"bar"可以扩展:

"foo " + +"bar"
"foo " + NaN
"foo NaN"

答案 2 :(得分:1)

此处+unary plus operator,它试图将运算符转换为数字&工作如下

+"" //return 0
+"Some" //returns NaN

所以这里

"Hello " + + "World!" 

将是

"Hello " + (+ "World!")
"Hello " + NaN
"Hello Nan"