18

我不小心输入了以下 JavaScript 语句"1" + - "2",得到了结果"1-2"。我不确定为什么将减号视为字符串而不是导致语法错误。

我试图搜索,但没有得到我想要的答案。

为什么减号被视为字符串?它有在线参考我可以看看?谢谢

4

3 回答 3

31

简单:- "2"计算结果为,-2因为一元-将其操作数强制为一个数字,这正是ECMA-262 规范中定义的行为。

11.4.7 一元-运算符

一元运算-符将其操作数转换为Number类型,然后取反。请注意,否定+0产生−0,否定−0产生+0

产生式 UnaryExpression : - UnaryExpression的评估如下:

  1. expr为计算 UnaryExpression 的结果。
  2. oldValueToNumber ( GetValue ( expr ))。
  3. 如果oldValueNaN,则返回NaN
  4. 返回否定oldValue的结果;也就是说,计算一个大小相同但符号相反的数字。

那么这只是字符串连接的问题:"1" + (-2)毫不奇怪,评估为"1-2". 至此,+在上下文中是字符串连接(而不是加法)运算符也就不足为奇了,因为这就是规范所说的。


TL;博士

因为,一如既往,这是规范要求的行为。

于 2013-11-07T19:57:41.690 回答
16

原本的

"1" + - "2"

被解析为

"1" + ( - "2" )

这里-将 转换"2"为数字并将其取反,因此- "2"计算为-2。所以这变成:

"1" + (-2)

在这里,+导致-2被转换为字符串,"-2"然后进行简单的字符串连接。

于 2013-11-07T19:58:43.853 回答
0

一元-运算符 (-x) 优先于二元+运算符 (x + y)。

所以"1" + - "2" 实际上被解析为"1" + -2,而后者又被解析为一个字符串连接"1" + "-2",最终得到"1-2".

于 2013-12-02T11:20:19.193 回答