SyntaxError: нельзя использовать ?? без скобок в выражениях || и &&
Исключение 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)
Тип ошибки
Что пошло не так?
Цепочка приоритетов операторов выглядит следующим образом:
| > && > || > = | > ?? > =
Однако приоритет между ?? и &&/|| намеренно не определен, поскольку поведение логических операторов с коротким замыканием может сделать вычисление выражения контринтуитивным. Поэтому следующие комбинации являются синтаксическими ошибками, поскольку язык не знает, как расставить скобки для операндов:
a ?? b || c; a || b ?? c; a ?? b && c; a && b ?? c;
Вместо этого проясните свое намерение, явно заключив в скобки одну из сторон:
(a ?? b) || c; a ?? (b && c);
Примеры
При переносе устаревшего кода, использующего || и && для защиты от null или undefined, вы часто можете частично преобразовать его:
function getId(user, fallback) {
// Previously: user && user.id || fallback
return user && user.id ?? fallback; // SyntaxError: cannot use `??` unparenthesized within `||` and `&&` expressions
}
Вместо этого рассмотрите возможность заключения && в скобки:
function getId(user, fallback) {
return (user && user.id) ?? fallback;
}
Еще лучше, рассмотрите возможность использования оператора опциональной цепочки вместо &&:
function getId(user, fallback) {
return user?.id ?? fallback;
}
См. также
- Issue about nullish coalescing precedence в предложении TC39 о нулевом слиянии
- Оператор нулевого слияния (
??) - Приоритет операторов
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Cant_use_nullish_coalescing_unparenthesized