> Как избежать ошибки при обращении к свойству объекта, если объект undefined? (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Исходный Код
Стек: JavaScript
> Пример ответа
Короткий ответ
Используйте optional chaining (?.) - obj?.prop?.nested. Для дефолтных значений - ?? (nullish coalescing). Для проверки существования свойства - in оператор или hasOwnProperty. В legacy коде - тернарник obj && obj.prop. Избегайте try/catch для простых проверок - это оверхед.
Подробное объяснение
Основные подходы к безопасному доступу к свойствам:
-
Optional chaining (
?.) - современный стандарт ES2020. Прерывает цепочку приnullилиundefinedи возвращаетundefined. Работает также с динамическими ключами (obj?.[key]) и вызовами функций (func?.()). -
Nullish coalescing (
??) - возвращает правый операнд только если левыйnullилиundefined. Отличается от||тем, что не считает0,'',falseза falsy значения. -
Логическое И (
&&) - классический паттернobj && obj.prop. Работает, но ломается на falsy значениях (0, пустая строка), если они валидны. -
Оператор
in- проверяет наличие свойства в объекте (включая прототип).'prop' in obj- безопасно для любогоobj, кромеnull/undefined. -
hasOwnProperty- проверяет собственные свойства, без прототипа. Лучше вызывать черезObject.prototype.hasOwnProperty.call(obj, 'prop')для защиты от переопределения. -
Деструктуризация с default -
const { prop = defaultValue } = obj || {}- удобно, но создает лишний объект.
На практике
Для вложенных объектов используйте цепочку ?. - это читаемо и безопасно. Комбинируйте с ?? для fallback значений. Избегайте глубоких цепочек - если структура сложная, лучше вынести логику в функцию-геттер или использовать библиотеку типа lodash.get.
При работе с API ответами всегда проверяйте наличие данных перед доступом. Для массивов используйте arr?.[index]. Для вызова методов - obj.method?.().
Пример кода
JAVASCRIPT// Плохо - может упастьconst city = user.address.city;// Хорошо - optional chainingconst city = user?.address?.city;// С дефолтным значениемconst city = user?.address?.city ?? 'Unknown';// Для массивовconst firstItem = arr?.[0];// Для вызова методаconst result = obj.method?.();// Проверка существования свойстваif ('city' in (user?.address ?? {})) {// свойство есть}// Безопасная деструктуризацияconst { city = 'Unknown' } = user?.address ?? {};
Как отвечать на собеседовании
Начните с optional chaining как основного решения. Упомяните разницу между ?? и ||. Покажите понимание edge cases: falsy значения, прототипное наследование, производительность. Если спросят про legacy - расскажите про паттерн && и lodash.get. Не забудьте упомянуть, что ?. нельзя использовать для левой части присваивания.
Что проверяет интервьюер
- Знание современных возможностей JS (ES2020+)
- Понимание разницы между
null/undefinedи falsy значениями - Умение выбирать правильный инструмент под задачу
- Осведомленность о производительности разных подходов
- Понимание границ применимости (когда
?.не подходит)
Типичные ошибки
- Использование
||вместо??- теряются валидные falsy значения - Чрезмерное использование
?.там, где объект гарантированно существует - снижает читаемость - Попытка использовать
?.в левой части присваивания - синтаксическая ошибка - Забывают, что
?.проверяет толькоnull/undefined, а не отсутствие свойства в объекте - Использование
try/catchдля простых проверок - плохая практика из-за оверхеда и скрытия реальных ошибок
> Похожие задачи по frontend
В чем разница function declaration, function expression и стрелочной функции в JavaScript
Расскажите про асинхронность в JavaScript и средства работы с асинхронным кодом
Как работает callback в методе map в JavaScript и что означают его аргументы
Из каких этапов состоит событийный цикл JavaScript
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью