语法错误:左值不能出现未加括号的一元表达式
当在指数运算符的左操作数上使用一元运算符(typeof
、void
、delete
、await
、!
、~
、+
、-
之一)且没有括号时,会出现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);
}
这也使代码的意图对其他读者更加清晰。
另请参阅
- 指数运算 (
**
) - 运算符优先级
- 指数运算符优先级原始讨论在esdiscuss.org上