Movatterモバイル変換


[0]ホーム

URL:


  1. Веб-технологии для разработчиков
  2. JavaScript
  3. Справочник по JavaScript
  4. Выражения и операторы
  5. Оператор нулевого слияния (??)

This page was translated from English by the community.Learn more and join the MDN Web Docs community.

View in EnglishAlways switch to English

Оператор нулевого слияния (??)

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). Ниже вы увидите примеры.

Оператор нулевого слияния вместе с|| находится начетвёртом по приоритетности месте, непосредственно перед ним следуетусловный (тернарный) оператор.

Интерактивный пример

const foo = null ?? "default string";console.log(foo);// Expected output: "default string"const baz = 0 ?? 42;console.log(baz);// Expected output: 0

Синтаксис

js
leftExpr ?? rightExpr;

Примеры

Использование оператора нулевого слияния

В этом примере показано как устанавливать значения по умолчанию, отличные отnull илиundefined.

js
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

Присваивание переменной значения по умолчанию

Ранее, когда нужно было присвоить переменной значение по умолчанию, часто использовался оператор ИЛИ (||):

js
let foo;// foo ещё не было присвоено значение, поэтому оно undefinedlet someDummyText = foo || "Hello!";

Однако поскольку|| является логическим оператором, левый операнд был принудительно приведен к булеву значению, игнорируя любоеложноподобное значение (0,'',NaN,null,undefined). Это может привести к некорректной работе кода, если нужно учитывать такие значения, как0,'', илиNaN.

js
let count = 0;let text = "";let qty = count || 42;let message = text || "hi!";console.log(qty); // 42, но не 0console.log(message); // "hi!", но не ""

Оператор нулевого слияния предотвращает попадание в такую ловушку, возвращая второй операнд, только если первый равенnull илиundefined (и не любым другим ложноподобным значением):

js
let myText = ""; // Пустая строка (ложноподобное значение)let notFalsyText = myText || "Привет, мир";console.log(notFalsyText); // Привет, мирlet preservingFalsy = myText ?? "Привет, сосед";console.log(preservingFalsy); // '' (т.к. myText не ни undefined, ни null)

Сокращённое вычисление

Так же как при использовании операторов логического И и ИЛИ, правое выражение не вычисляется, если значение в левом выражении не равняетсяnull илиundefined

js
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.

js
null || undefined ?? "foo"; // вызывает SyntaxErrortrue || undefined ?? "foo"; // вызывает SyntaxError

Но если явно указать приоритет, создав подвыражение через круглые скобки, то всё заработает:

js
(null || undefined) ?? "foo"; // вернёт "foo"

Использование совместно с оператором опциональной последовательности (?.)

Оператор нулевого слияния учитывает значенияundefined иnull, по аналогии как и оператор опциональной последовательности (?.)(/ru/docs/Web/JavaScript/Reference/Operators/Optional_chaining), который позволяет избежать ошибок при обращении к свойству объекта, которое может бытьnull илиundefined.

js
let foo = { someFooProp: "привет" };console.log(foo.someFooProp?.toUpperCase() ?? "нет значения"); // "ПРИВЕТ"console.log(foo.someBarProp?.toUpperCase() ?? "нет значения"); // "нет значения"

Спецификации

Specification
ECMAScript® 2026 Language Specification
# prod-CoalesceExpression

Совместимость с браузерами

Смотрите также

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp