This page was translated from English by the community.Learn more and join the MDN Web Docs community.
Оператор нулевого слияния (??)
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since июль 2020 г..
Оператор нулевого слияния (??) — это логический оператор, возвращающий значение правого операнда, если значение левого операнда содержитnull илиundefined, в противном случае возвращается значение левого операнда.
Этот оператор можно рассматривать как частный случайлогического оператора ИЛИ(||), который возвращает правый операнд, если в левом операнде хранитсялюбоеложноподобное значение, а не толькоnull илиundefined. Другими словами, если вы используете оператор|| для присваивания значения по умолчанию другой переменнойfoo, вы можете столкнуться с неожиданным поведением, если считаете некоторые ложноподобные значения пригодными для использования (например,'' или0). Ниже вы увидите примеры.
Оператор нулевого слияния вместе с|| находится начетвёртом по приоритетности месте, непосредственно перед ним следуетусловный (тернарный) оператор.
In this article
Интерактивный пример
const foo = null ?? "default string";console.log(foo);// Expected output: "default string"const baz = 0 ?? 42;console.log(baz);// Expected output: 0Синтаксис
leftExpr ?? rightExpr;Примеры
>Использование оператора нулевого слияния
В этом примере показано как устанавливать значения по умолчанию, отличные отnull илиundefined.
const nullValue = null;const emptyText = ""; // ложноподобноеconst someNumber = 42;const valA = nullValue ?? "значение для A";const valB = emptyText ?? "значение для B";const valC = someNumber ?? 0;console.log(valA); // "значение для A"console.log(valB); // "" (поскольку пустая строка не приравнивается к null или undefined)console.log(valC); // 42Присваивание переменной значения по умолчанию
Ранее, когда нужно было присвоить переменной значение по умолчанию, часто использовался оператор ИЛИ (||):
let foo;// foo ещё не было присвоено значение, поэтому оно undefinedlet someDummyText = foo || "Hello!";Однако поскольку|| является логическим оператором, левый операнд был принудительно приведен к булеву значению, игнорируя любоеложноподобное значение (0,'',NaN,null,undefined). Это может привести к некорректной работе кода, если нужно учитывать такие значения, как0,'', илиNaN.
let count = 0;let text = "";let qty = count || 42;let message = text || "hi!";console.log(qty); // 42, но не 0console.log(message); // "hi!", но не ""Оператор нулевого слияния предотвращает попадание в такую ловушку, возвращая второй операнд, только если первый равенnull илиundefined (и не любым другим ложноподобным значением):
let myText = ""; // Пустая строка (ложноподобное значение)let notFalsyText = myText || "Привет, мир";console.log(notFalsyText); // Привет, мирlet preservingFalsy = myText ?? "Привет, сосед";console.log(preservingFalsy); // '' (т.к. myText не ни undefined, ни null)Сокращённое вычисление
Так же как при использовании операторов логического И и ИЛИ, правое выражение не вычисляется, если значение в левом выражении не равняетсяnull илиundefined
function A() { console.log("вызвана A"); return undefined;}function B() { console.log("вызвана B"); return false;}function C() { console.log("вызвана C"); return "foo";}console.log(A() ?? C());// в консоли будет будет выведено "вызвана A", после "вызвана C", и затем "foo",// т.к. A() возвращает undefined, поэтому оба выражения были вычисленыconsole.log(B() ?? C());// в консоли будет выведено "вызвана B", затем "false",// так B() возвращает false (не null или undefined), то// правое выражение не вычисляетсяИспользование вместе с операторами И или ИЛИ
Не получится использовать оператор И (&&) и ИЛИ (||) вместе с оператором?? в одном выражении. В таких случаях будет вызвана ошибкаSyntaxError.
null || undefined ?? "foo"; // вызывает SyntaxErrortrue || undefined ?? "foo"; // вызывает SyntaxErrorНо если явно указать приоритет, создав подвыражение через круглые скобки, то всё заработает:
(null || undefined) ?? "foo"; // вернёт "foo"Использование совместно с оператором опциональной последовательности (?.)
Оператор нулевого слияния учитывает значенияundefined иnull, по аналогии как и оператор опциональной последовательности (?.)(/ru/docs/Web/JavaScript/Reference/Operators/Optional_chaining), который позволяет избежать ошибок при обращении к свойству объекта, которое может бытьnull илиundefined.
let foo = { someFooProp: "привет" };console.log(foo.someFooProp?.toUpperCase() ?? "нет значения"); // "ПРИВЕТ"console.log(foo.someBarProp?.toUpperCase() ?? "нет значения"); // "нет значения"Спецификации
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # prod-CoalesceExpression> |