Spec-Zone.ru › JavaScript

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

Базовый уровень Широко доступен

Эта функция хорошо зарекомендовала себя и работает на множестве устройств и версий браузеров. Она доступна в браузерах с сентября 2020 года.

Оператор нулевого слияния (??) — это логический оператор, который возвращает свой правый операнд, когда его левый операнд является null или undefined, и в противном случае возвращает свой левый операнд.

Попробуйте

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. Другими словами, если вы используете || для предоставления значения по умолчанию другой переменной foo, вы можете столкнуться с неожиданным поведением, если считаете некоторые ложные значения допустимыми (например, '' или 0). См. ниже для получения дополнительных примеров.

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

Невозможно напрямую объединить операторы И (&&) или ИЛИ (||) с ??. В таких случаях будет сгенерирована ошибка синтаксиса.

null || undefined ?? "foo"; // raises a SyntaxError
true && undefined ?? "foo"; // raises a SyntaxError

Вместо этого используйте круглые скобки для явного указания приоритета:

(null || undefined) ?? "foo"; // returns "foo"

Примеры

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

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

const nullValue = null;
const emptyText = ""; // falsy
const someNumber = 42;

const valA = nullValue ?? "default for A";
const valB = emptyText ?? "default for B";
const valC = someNumber ?? 0;

console.log(valA); // "default for A"
console.log(valB); // "" (as the empty string is not null or undefined)
console.log(valC); // 42

Назначение значения по умолчанию переменной

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

let foo;

// foo is never assigned any value so it is still undefined
const someDummyText = foo || "Hello!";

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

const count = 0;
const text = "";

const qty = count || 42;
const message = text || "hi!";
console.log(qty); // 42 and not 0
console.log(message); // "hi!" and not ""

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

const myText = ""; // An empty string (which is also a falsy value)

const notFalsyText = myText || "Hello world";
console.log(notFalsyText); // Hello world

const preservingFalsy = myText ?? "Hi neighborhood";
console.log(preservingFalsy); // '' (as myText is neither undefined nor null)

Короткое замыкание

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

function a() {
  console.log("a was called");
  return undefined;
}
function b() {
  console.log("b was called");
  return false;
}
function c() {
  console.log("c was called");
  return "foo";
}

console.log(a() ?? c());
// Logs "a was called" then "c was called" and then "foo"
// as a() returned undefined so both expressions are evaluated

console.log(b() ?? c());
// Logs "b was called" then "false"
// as b() returned false (and not null or undefined), the right
// hand side expression was not evaluated

Связь с оператором опциональной цепочки (?.)

Оператор нулевого слияния обрабатывает undefined и null как конкретные значения. То же самое делает оператор опциональной цепочки (?.), который полезен для доступа к свойству объекта, который может быть null или undefined. Объединив их, вы можете безопасно получить доступ к свойству объекта, которое может быть нулевым, и предоставить значение по умолчанию, если оно таковым является.

const foo = { someFooProp: "hi" };

console.log(foo.someFooProp?.toUpperCase() ?? "not available"); // "HI"
console.log(foo.someBarProp?.toUpperCase() ?? "not available"); // "not available"

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

Спецификация
ECMAScript® 2027 Language Specification
# prod-CoalesceExpression

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

Настольные компьютеры Мобильные устройства Сервер
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
nullish_coalescing
80
80
72
67
13.1
80
79
57
13.4
13.0
80
13.4
1.0.0
1.0
14.0.0

См. также

  • Оператор присваивания нулевого слияния (??=)
  • Опциональная цепочка (?.)
  • Логическое ИЛИ (||)
  • Параметры по умолчанию

© 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/Operators/Nullish_coalescing

Spec-Zone.ru

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