每个人都知道JavaScript中两个字符串的基本连接:
> "Hello " + "World!"
'Hello World!'
但如果我们使用+ +
代替+
会怎样?我刚刚遇到了以下奇怪的行为:
> "Hello " + + "World!"
'Hello NaN'
> "Hello " + + ""
'Hello 0'
从上面的例子中,我可以看到第二个字符串被转换为数字。因此,将具有valueOf
属性的对象作为函数传递,将转换该函数返回的值。
> "Hello " + + ({valueOf: function () {return 1; }})
'Hello 1'
正如所料,它显示"Hello 1"
。
为什么第二个字符串在Number
转换?为什么不抛出语法错误呢?
答案 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"