Spec-Zone.ru › JavaScript

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)

Тип ошибки

SyntaxError

Что пошло не так?

Цепочка приоритетов операторов выглядит следующим образом:

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

Однако приоритет между ?? и &&/|| намеренно не определен, поскольку поведение логических операторов с коротким замыканием может сделать вычисление выражения контринтуитивным. Поэтому следующие комбинации являются синтаксическими ошибками, поскольку язык не знает, как расставить скобки для операндов:

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API