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:
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:
(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:
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:
function getId(user, fallback) {
  return (user && user.id) ?? fallback;
}
Noch besser ist es, optionale Verkettung anstelle von && zu verwenden:
function getId(user, fallback) {
  return user?.id ?? fallback;
}
Siehe auch
- Issue über die Präzedenz des Nullish Coalescing Operators im TC39 Nullish-Coalescing-Vorschlag
 - Nullish Coalescing Operator (
??) - Operatorpräzedenz