SyntaxError: `??` kann nicht ohne Klammern innerhalb von `||` und `&&`-Ausdrücken verwendet werden

Der JavaScript-Ausnahmefehler "?? kann nicht ohne Klammern innerhalb von || und &&-Ausdrücken verwendet werden" tritt auf, wenn ein Operator für nullish coalescing 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

Was ist schiefgelaufen?

Die Operatorrangfolge sieht wie folgt aus:

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

Allerdings ist die Rangfolge zwischen ?? und &&/|| absichtlich undefiniert, da das Kurzschließen der logischen Operatoren die Bewertung des Ausdrucks kontraintuitiv machen kann. Daher sind die folgenden Kombinationen alle Syntaxfehler, da die Sprache nicht weiß, wie die Operanden zu klammern sind:

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

Stattdessen sollten Sie Ihre Absicht klar machen, indem Sie jede Seite explizit klammern:

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

Beispiele

Beim Migrieren von Legacy-Code, der || und && verwendet, um sich gegen null oder undefined abzusichern, konvertiert man ihn oft 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, ziehen Sie in Betracht, optionale Verkettung anstelle von && zu verwenden:

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

Siehe auch