> Для чего нужен оператор nullish coalescing (??) и как он работает в JavaScript (JavaScript)

Уровень: senior · Роль: frontend · Категория: Технические вопросы

Компании: IT-One

Стек: JavaScript

> Пример ответа

Короткий ответ

Оператор nullish coalescing (??) возвращает правый операнд, только если левый равен null или undefined. Он отличается от || тем, что не считает falsy-значения (0, '', false, NaN) "пустыми". Это позволяет безопасно задавать значения по умолчанию, не ломая валидные данные. Появился в ES2020, работает в современных браузерах и Node.js.

Подробное объяснение

Nullish coalescing решает конкретную проблему: оператор логического ИЛИ (||) слишком "жадный" - он подставляет значение по умолчанию для любого falsy-значения. Например, 0 || 10 вернёт 10, хотя 0 может быть корректным результатом.

?? проверяет только два значения: null и undefined. Всё остальное - включая 0, пустую строку, false, NaN - считается "настоящим" значением и не заменяется.

Ключевые особенности:

  • Нельзя смешивать ?? с && или || без скобок - это синтаксическая ошибка, потому что JavaScript не может однозначно определить приоритет.
  • Оператор работает слева направо, но из-за низкого приоритета обычно требует скобок в сложных выражениях.
  • Часто используется с optional chaining (?.) для безопасного доступа к вложенным свойствам с дефолтным значением.
  • В отличие от ||, ?? не вызывает правый операнд, если левый не null/undefined - это важно для дорогих вычислений.

На практике

Типичные сценарии использования:

  • Параметры функций и настройки конфигурации, где 0 или '' - допустимые значения.
  • Работа с API-ответами, где поле может отсутствовать (undefined) или быть null.
  • Комбинация с ?. для получения вложенных данных с fallback.
  • Инициализация переменных, когда нужно отличить "не задано" от "задано, но пустое".

Важно помнить: ?? не заменяет || полностью. Если вам нужно обрабатывать все falsy-значения (например, пустую строку как отсутствие), используйте ||.

Пример кода

JAVASCRIPT
// Базовое поведение
const value = 0;
console.log(value ?? 10); // 0 - потому что 0 не null/undefined
console.log(value || 10); // 10 - потому что 0 falsy
// Отличие от ||
const emptyString = '';
console.log(emptyString ?? 'default'); // ''
console.log(emptyString || 'default'); // 'default'
// С optional chaining
const user = { profile: { age: 0 } };
const age = user?.profile?.age ?? 25;
console.log(age); // 0, а не 25
// Нельзя смешивать без скобок
// const x = a ?? b || c; // SyntaxError
const x = (a ?? b) || c; // так можно
// Ленивое вычисление
function getDefault() {
console.log('вызвано');
return 42;
}
const result = 5 ?? getDefault(); // getDefault не вызовется

Как отвечать на собеседовании

Начните с краткого определения, затем покажите разницу с || на конкретном примере с 0. Обязательно упомяните ограничение на смешивание с &&/|| - это показывает глубокое понимание. Расскажите про типичные сценарии: конфигурация, API-данные, optional chaining. Если спросят про приоритет - скажите, что ?? имеет более низкий приоритет, чем ||, поэтому требуются скобки. Хорошо добавить пример с ленивым вычислением, чтобы показать понимание performance-аспекта.

Что проверяет интервьюер

  • Понимаете ли вы разницу между null/undefined и falsy-значениями.
  • Знаете ли вы, когда ?? уместен, а когда нужен ||.
  • Помните ли вы про синтаксическое ограничение на смешивание с логическими операторами.
  • Умеете ли комбинировать с optional chaining.
  • Понимаете ли вы семантику "отсутствия значения" в JavaScript.

Типичные ошибки

  • Утверждение, что ?? работает "как ||, но для null" - нет, он игнорирует все falsy, кроме двух.
  • Попытка использовать ?? для обработки пустой строки как отсутствия - для этого нужен ||.
  • Забывают про синтаксическую ошибку при смешивании с &&/|| без скобок.
  • Путают приоритет: думают, что ?? выше, чем || - на самом деле наоборот.
  • Используют ?? там, где нужно явно проверить на null и undefined отдельно - оператор не различает эти два значения.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью