语法错误:左值不能出现未加括号的一元表达式

当在指数运算符的左操作数上使用一元运算符(typeofvoiddeleteawait!~+-之一)且没有括号时,会出现JavaScript异常“未加括号的一元表达式不能出现在'**'左侧”。

消息

SyntaxError: Unary operator used immediately before exponentiation expression. Parenthesis must be used to disambiguate operator precedence (V8-based)
SyntaxError: unparenthesized unary expression can't appear on the left-hand side of '**' (Firefox)
SyntaxError: Unexpected token '**'. Ambiguous unary expression in the left hand side of the exponentiation expression; parentheses must be used to disambiguate the expression. (Safari)

错误类型

哪里出错了?

您可能写了类似这样的代码

js
-a ** b

是否应该将其评估为(-a) ** b-(a ** b)是不明确的。在数学中,-x2表示-(x ** 2)——并且许多语言(包括Python、Haskell和PHP)都是这样处理的。但是,使一元减号运算符优先于**会破坏与a ** -b的对称性,后者明确地表示为a ** (-b)。因此,该语言禁止这种语法,并要求您对任一侧使用括号来解决歧义。

js
(-a) ** b
-(a ** b)

其他一元运算符也不能是指数运算符的左侧。

js
await a ** b
!a ** b
+a ** b
~a ** b

示例

在编写涉及指数运算的复杂数学表达式时,您可能会写类似这样的代码

js
function taylorSin(x) {
  return (n) => (-1 ** n * x ** (2 * n + 1)) / factorial(2 * n + 1);
  // SyntaxError: unparenthesized unary expression can't appear on the left-hand side of '**'
}

但是,-1 ** n部分在JavaScript中是非法的。改为对左操作数使用括号

js
function taylorSin(x) {
  return (n) => ((-1) ** n * x ** (2 * n + 1)) / factorial(2 * n + 1);
}

这也使代码的意图对其他读者更加清晰。

另请参阅