Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

SyntaxError: Der `??`-Operator kann nicht unverklammert innerhalb von `||` und `&&`-Ausdrücken verwendet werden

Der JavaScript-Ausnahmefehler "Der ??-Operator kann nicht unverklammert innerhalb von || und &&-Ausdrücken verwendet werden" tritt auf, wenn ein Nullish Coalescing Operator mit einem logischen ODER oder logischen UND im selben Ausdruck ohne Klammern verwendet wird.

Nachricht

SyntaxError: Unexpected token '??' (V8-based)
SyntaxError: cannot use `??` unparenthesized within `||` and `&&` expressions (Firefox)
SyntaxError: Unexpected token '??'. Coalescing and logical operators used together in the same expression; parentheses must be used to disambiguate. (Safari)

Fehlertyp

SyntaxError

Was ist schiefgelaufen?

Die Operatorpräzedenz-Kette sieht so aus:

|   >   &&   >   ||   >   =
|   >   ??   >   =

Die Präzedenz zwischen ?? und &&/|| ist jedoch absichtlich undefiniert, da das Kurzschließungsverhalten der logischen Operatoren die Auswertung des Ausdrucks kontraintuitiv machen kann. Daher sind die folgenden Kombinationen alle Syntaxfehler, da die Sprache nicht weiß, wie sie die Operanden klammern soll:

js
a ?? b || c;
a || b ?? c;
a ?? b && c;
a && b ?? c;

Stattdessen machen Sie Ihre Absicht deutlich, indem Sie entweder auf der einen oder der anderen Seite explizit klammern:

js
(a ?? b) || c;
a ?? (b && c);

Beispiele

Wenn Sie alten Code migrieren, der || und && zur Absicherung gegen null oder undefined verwendet, konvertieren Sie ihn möglicherweise teilweise:

js
function getId(user, fallback) {
  // Previously: user && user.id || fallback
  return user && user.id ?? fallback; // SyntaxError: cannot use `??` unparenthesized within `||` and `&&` expressions
}

Stattdessen sollten Sie das && klammern:

js
function getId(user, fallback) {
  return (user && user.id) ?? fallback;
}

Noch besser ist es, optionale Verkettung anstelle von && zu verwenden:

js
function getId(user, fallback) {
  return user?.id ?? fallback;
}

Siehe auch