SyntaxError: unparenthesized unary expression can't appear on the left-hand side of '**'
Der JavaScript-Ausnahmefehler "unparenthesized unary expression can't appear on the left-hand side of '**'" tritt auf, wenn ein unäres Operator (einer von typeof
, void
, delete
, await
, !
, ~
, +
, -
) ohne Klammern auf dem linken Operanden des Exponentiationsoperators verwendet wird.
Nachricht
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)
Fehlertyp
Was ist schiefgelaufen?
Sie haben wahrscheinlich etwas wie folgt geschrieben:
-a ** b
Ob dies als (-a) ** b
oder -(a ** b)
ausgewertet werden soll, ist mehrdeutig. In der Mathematik bedeutet -x2 -(x ** 2)
— und so handhaben es viele Sprachen, einschließlich Python, Haskell und PHP. Aber das Priorisieren des unären Minusoperators über **
bricht die Symmetrie mit a ** -b
, was eindeutig a ** (-b)
ist. Daher verbietet die Sprache diese Syntax und erfordert, dass Sie eine Seite klammern, um die Mehrdeutigkeit aufzulösen.
(-a) ** b
-(a ** b)
Andere unäre Operatoren können ebenfalls nicht die linke Seite der Exponentiation sein.
await a ** b
!a ** b
+a ** b
~a ** b
Beispiele
Beim Schreiben komplexer mathematischer Ausdrücke, die Exponentiationen beinhalten, könnten Sie so etwas schreiben:
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 '**'
}
Der Teil -1 ** n
ist jedoch in JavaScript illegal. Stattdessen sollten Sie den linken Operanden klammern:
function taylorSin(x) {
return (n) => ((-1) ** n * x ** (2 * n + 1)) / factorial(2 * n + 1);
}
Dies macht die Absicht des Codes auch für andere Leser viel klarer.