SyntaxError: cannot use `??` unparenthesized within `||` and `&&` expressions

空值合併運算子(nullish coalescing operator)在同一個表示式中不加括號地與邏輯或(logical OR)邏輯與(logical AND)一起使用時,會發生 JavaScript 異常 "不能在 ||&& 表示式中不加括號地使用 ??"。

訊息

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)

錯誤型別

SyntaxError

哪裡出錯了?

運算子優先順序鏈如下所示

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

然而,??&&/|| 之間的優先順序是故意未定義的,因為邏輯運算子的短路行為可能會使表示式的評估反直覺。因此,以下所有組合都是語法錯誤,因為語言不知道如何對運算元進行括號化

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

相反,透過顯式地將任一側加上括號來明確你的意圖

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

示例

在遷移使用 ||&& 來防止 nullundefined 的舊程式碼時,你可能經常會部分轉換它

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

相反,考慮將 && 括起來

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

甚至更好,考慮使用可選鏈(optional chaining)而不是 &&

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

另見