为什么-1**2在JavaScript中出现语法错误?

psm*_*ith 56 javascript exponentiation ecmascript-2016

它说,在浏览器控制台中执行它SyntaxError: Unexpected token **.在节点中尝试:

> -1**2
...
...
...
...^C
Run Code Online (Sandbox Code Playgroud)

我认为这是一个算术表达式,其中**是幂运算符.其他运营商没有这样的问题.

奇怪的是,*/在第二行输入会触发执行:

> -1**2
... */
-1**2
  ^^
SyntaxError: Unexpected token **
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

小智 79

在浏览器控制台中执行它说SyntaxError:Unexpected token**.

因为这是规范.设计的方式是为了避免混淆是否是一个(即(-1) ** 2)的否定的平方,或一个(即)的平方的否定-(1 ** 2).这种设计是对运算符优先级的广泛讨论的结果,并检查了如何在其他语言中处理它,最后决定通过使这成为语法错误来避免意外行为.

  • @slebetman`-1 ^ 2`在数学中从不被视为`(-1)^ 2`.你有没有看过多项式的写法?如果我们按照您的说法,我们必须写` - (x ^ 2)+ bx + c`而不是通常使用的`-x ^ 2 + bx + c`.并且,更一般地,`a(x ^ 2)+ bx + c`而不是`ax ^ 2 + bx + c`. (56认同)
  • 这个评论主题似乎正好强调了为什么它被删除:以防止混淆.我的直接反应是把它解释为`(-1)**2',因为一元通常优先于二元,但当然将它解释为` - (1**2)`以保持一致性也是有意义的.数学.删除该功能意味着不是写一些东西而是让它以不同的方式工作,你只会得到语法错误并查找推理(在StackOverflow上,或许!),然后将优先级显式化 - 不再混淆. (33认同)
  • @slebetman在数学`-3⁴`中的意思是` - (3⁴)`,而不是`( - 3)⁴` (20认同)
  • @EricDuminil:Javascript曾经是这样的,但是人们正在尽最大努力不按照旧的精神做出新的设计决策. (8认同)
  • @Adriaan:不对.在常规数学中,数字的否定性通常不被视为减法.实际上,减去一个正方形被视为负1的平方而不是一个正方形的负数,因此它是1而不是-1.换句话说," - 1"并不意味着"0-1"而是"1*-1" (7认同)
  • 从运算符优先级角度看有趣的决策,因为功率总是在加/减之前出现.因此`-1**2`是`-1`,而不是`1`. (5认同)
  • @Schism:除了Javascript,你的观点对任何语言都有意义.JS从不关心一致性,令人惊讶的结果或奇怪的隐式转换.在JS中,我希望`-1**2`返回'NaN`,`[]`或`''`,但肯定不会引发异常. (4认同)
  • 令人难以置信的决定,使其成为语法错误.作为语法错误检测它会更加困难,并提供这个非常具体的错误消息,而不是以任何方式实际实现它. (2认同)

tri*_*cot 40

MDN文档:

在JavaScript中,这是不可能写出暧昧幂表达式,即你不能把一元运算符(+/ -/ ~/ !/ delete/ void/ typeof)之前的基数.

原因也在同一文本中解释:

在大多数语言(如PHP和Python)和其他具有取幂运算符(通常^或者**)的语言中,指数运算符被定义为具有比一元运算符(如一元+和一元)更高的优先级-,但也有一些例外.例如,在Bash中,**运算符被定义为具有比一元运算符更低的优先级.

因此,为了避免混淆,我们决定代码必须消除歧义并明确地放置括号:

(-1)**2
Run Code Online (Sandbox Code Playgroud)

要么:

-(1**2) 
Run Code Online (Sandbox Code Playgroud)

作为旁注,二进制文件 -不会被这样处理 - 具有较低的优先级 - 因此最后一个表达式与此有效表达式具有相同的结果:

0-1**2
Run Code Online (Sandbox Code Playgroud)

其他编程语言中的指数优先级

正如上面引用中已经肯定的那样,大多数具有中缀取幂运算符的编程语言给予该运算符的优先级高于一元减号.

以下是编程语言的一些其他示例,它们为一元减运算符提供更高的优先级:

  • 当语言设计者将bash视为先例时,一些愚蠢的东西即将发生. (21认同)
  • @WumpusQ.Wumbley"设计师"在谈论负责JS的人时非常强烈.如果您以前从未尝试过,请查看`[] + []`,`[] + {}`,`{} + []`和`{} + {}`的结果. (7认同)
  • @EricDuminil我刚试过这个.我的fla fla之前从未如此完全被淹过. (4认同)