> Для чего нужен оператор 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/undefinedconsole.log(value || 10); // 10 - потому что 0 falsy// Отличие от ||const emptyString = '';console.log(emptyString ?? 'default'); // ''console.log(emptyString || 'default'); // 'default'// С optional chainingconst user = { profile: { age: 0 } };const age = user?.profile?.age ?? 25;console.log(age); // 0, а не 25// Нельзя смешивать без скобок// const x = a ?? b || c; // SyntaxErrorconst 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отдельно - оператор не различает эти два значения.
> Похожие задачи по frontend
Чем собственные свойства отличаются от унаследованных в JavaScript
Пример замыкания с внутренней функцией и предмет замыкания в JavaScript
Как обращаться к объекту массива через this в JavaScript
Сколько времени занял рефакторинг и каков был объем работы
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью