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:

js
-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.

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

Andere unäre Operatoren können ebenfalls nicht die linke Seite der Exponentiation sein.

js
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:

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 '**'
}

Der Teil -1 ** n ist jedoch in JavaScript illegal. Stattdessen sollten Sie den linken Operanden klammern:

js
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.

Siehe auch