当幂运算符的左操作数为负时,为什么会出现语法错误?

时间:2018-08-30 21:33:36

标签: javascript operator-precedence exponent ecmascript-2016

当我在JavaScript中使用指数运算符(**)时,它通常可以按预期工作:

2 ** 2   // 4
2 ** -2  // 0.25

但是当左操作数为负时

-2 ** 2

我收到语法错误:

  

未捕获的SyntaxError:意外令牌**

我可以通过在-2上加上括号来轻松解决它

(-2) ** 2 // 4

但是我很好奇导致此错误的原因。其他运算符(+ - * / %等)没有此问题。为什么**运算符会发生这种情况?

2 个答案:

答案 0 :(得分:2)

此行为是故意的,可以防止您编写歧义的表达式。 From MDN

  

在大多数语言中,例如PHP和Python,以及其他具有   幂运算符(**),定义了幂运算符   比一元运算符(如一元+和   一元-,但也有一些例外。例如,在Bash中,**   运算符被定义为比一元运算符具有更低的优先级。   在JavaScript中,不可能写出模棱两可的幂   表达式,即您不能放置一元运算符   (+ /-/〜/!/ delete / void / typeof)紧靠基数。

-2 ** 2; 
// 4 in Bash, -4 in other languages. 
// This is invalid in JavaScript, as the operation is ambiguous. 


-(2 ** 2); 
// -4 in JavaScript and the author's intention is unambiguous.

答案 1 :(得分:-1)

有趣。我确实在Mozilla上找到了一些文档,这些文档说明了为什么这是不可能的。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Arithmetic_Operators#Exponentiation

2 ** -3是可能的。