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

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

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

我认为这是一个算术expression式,其中**是电力运营商。 其他运营商没有这个问题。

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

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

这里发生了什么?

在浏览器控制台中执行它说:SyntaxError:意外的令牌**。

因为这是规范 。 devise这样的方式,以避免混淆是否是一个否定的平方(即(-1) ** 2 ),或否定一个平方(即-(1 ** 2) )。 这个devise是对运算符优先级进行广泛讨论的结果,以及如何在其他语言中处理这个问题的结果,最后决定通过将这个语法错误来避免意外的行为。

从MDN上的文档 :

在JavaScript中,不可能写出一个含糊的幂指数expression式,也就是说,不能在基数之前加一个一元运算符( + / - / ~ / ! / delete / void / typeof )。

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

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

所以为了避免混淆,决定代码必须消除模糊性,并明确地将括号括起来:

 (-1)**2 

要么:

 -(1**2) 

作为一个方面说明, 二进制 -不是那样处理 – 具有较低的优先级 – 因此最后一个expression式与此有效expression式具有相同的结果:

 0-1**2 

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

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

下面是编程语言的其他一些例子,给出了一元减运算符的更高优先级:

  • 公元前
  • VBScript中
  • AppleScript的
  • COBOL
  • 的Rexx