SyntaxError: `??` kann nicht ohne Klammern innerhalb von `||` und `&&`-Ausdrücken verwendet werden
Die JavaScript-Ausnahme "kann ??
nicht ohne Klammern innerhalb von ||
und &&
-Ausdrücken verwenden" tritt auf, wenn ein Nullish-Koaleszenz-Operator mit einem logischen ODER oder logischen UND im gleichen Ausdruck ohne Klammern verwendet wird.
Meldung
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)
Fehlerart
Was ist schiefgelaufen?
Die Operator-Priorität Kette sieht folgendermaßen aus:
| > && > || > = | > ?? > =
Allerdings ist die Priorität zwischen ??
und &&
/||
absichtlich undefiniert, da das Kurzschlussverhalten von logischen Operatoren die Auswertung des Ausdrucks kontraintuitiv machen kann. Daher sind die folgenden Kombinationen alles 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 sollten Sie Ihre Absicht klarstellen, indem Sie eine der beiden Seiten ausdrücklich in Klammern setzen:
(a ?? b) || c;
a ?? (b && c);
Beispiele
Wenn Sie alten Code migrieren, der ||
und &&
zum Schutz 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 &&
in Klammern setzen:
function getId(user, fallback) {
return (user && user.id) ?? fallback;
}
Noch besser, ziehen Sie in Betracht, die optionale Verkettung anstelle von &&
zu verwenden:
function getId(user, fallback) {
return user?.id ?? fallback;
}
Siehe auch
- Problem zur Nullish-Coalescing-Präzedenz im TC39 Nullish-Coalescing-Vorschlag
- Nullish-Koaleszenz-Operator (
??
) - Operator-Priorität