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: cannot use ?? unparenthesized within || and && expressions

Die JavaScript-Ausnahme "cannot use ?? unparenthesized within || and && expressions" tritt auf, wenn ein nullish coalescing operator zusammen 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-Reihenfolge sieht so aus:

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

Allerdings ist die Präzedenz zwischen ?? und &&/|| absichtlich undefiniert, da das Short-Circuit-Verhalten von logischen Operatoren die Auswertung des Ausdrucks kontraintuitiv machen kann. Daher sind die folgenden Kombinationen alle Syntaxfehler, weil die Sprache nicht weiß, wie die Operanden geklammert werden sollen:

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

Stattdessen machen Sie Ihre Absicht deutlich, indem Sie entweder die eine oder andere Seite explizit klammern:

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

Beispiele

Wenn Sie Legacy-Code migrieren, der || und && verwendet, um gegen null oder undefined abzusichern, können Sie ihn oft teilweise konvertieren:

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, optionales Verketteln anstelle von && zu verwenden:

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

Siehe auch