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

时间:2017-04-22 07:54:33

标签: javascript exponentiation ecmascript-2016

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

> -1**2
...
...
...
...^C

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

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

> -1**2
... */
-1**2
  ^^
SyntaxError: Unexpected token **

这里发生了什么?

2 个答案:

答案 0 :(得分:79)

  

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

因为那是spec。设计的方式是避免混淆是否是一个(即(-1) ** 2)的否定的平方,或者是一个平方的否定(即-(1 ** 2))。这个设计是extensive discussion运算符优先级的结果,并检查了如何在其他语言中处理它,最后决定通过使这个语法错误来避免意外行为。

答案 1 :(得分:40)

来自documentation on MDN

  

在JavaScript中,不可能编写模糊的取幂表达式,即你不能放置一元运算符(+ / - / ~ / ! / {{紧靠基数之前的1}} / delete / void}。

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

  

在大多数语言中,如PHP和Python以及其他具有取幂运算符的语言(通常为typeof^),指数运算符的优先级高于一元运算符(如一元{{ 1}}和一元**,但也有一些例外。例如,在Bash中,+运算符的优先级低于一元运算符。

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

-

或:

**

作为旁注,二进制 (-1)**2 不会被这样对待 - 具有较低的优先级 - 因此最后一个表达式与此有效表达式具有相同的结果:

-(1**2) 

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

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

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