SyntaxError: unverklammerter unärer Ausdruck kann nicht auf der linken Seite von '**' erscheinen
Die JavaScript-Ausnahme "unverklammerter unärer Ausdruck kann nicht auf der linken Seite von '**' erscheinen" tritt auf, wenn ein unärer Operator (einer von typeof
, void
, delete
, await
, !
, ~
, +
, -
) ohne Klammern auf dem linken Operand des Exponentiationsoperators verwendet wird.
Meldung
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 in der Art wie das Folgende geschrieben:
-a ** b
Ob es als (-a) ** b
oder -(a ** b)
ausgewertet werden sollte, ist unklar. In der Mathematik bedeutet -x2 -(x ** 2)
— und so handhaben es viele Sprachen, einschließlich Python, Haskell und PHP. Aber das Vorziehen des unären Minusoperators vor **
würde die Symmetrie mit a ** -b
brechen, was eindeutig a ** (-b)
ist. Daher verbietet die Sprache diese Syntax und erfordert, dass Sie entweder die eine oder die andere Seite klammern, um die Mehrdeutigkeit zu lösen.
(-a) ** b
-(a ** b)
Auch andere unäre Operatoren können nicht die linke Seite der Exponentiation sein.
await a ** b
!a ** b
+a ** b
~a ** b
Beispiele
Beim Schreiben komplexer mathematischer Ausdrücke mit Exponentiation könnten Sie etwas wie das Folgende 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 nicht zulässig. Stattdessen sollten Sie den linken Operand klammern:
function taylorSin(x) {
return (n) => ((-1) ** n * x ** (2 * n + 1)) / factorial(2 * n + 1);
}
Dies macht auch die Absicht des Codes für andere Leser viel klarer.