> Как проверить наличие свойства в объекте в JavaScript (JavaScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Иннотех, Soft_Media_Group
Стек: JavaScript
> Пример ответа
Короткий ответ
В JavaScript есть несколько способов проверить наличие свойства в объекте: оператор in, метод hasOwnProperty, сравнение с undefined и Object.hasOwn(). Основное различие между ними - проверяют ли они только собственные свойства или также наследуемые через prototype chain. Для большинства случаев рекомендуется использовать Object.hasOwn() (ES2022) или hasOwnProperty для собственных свойств, и in - если нужно учитывать prototype chain.
Подробное объяснение
Выбор метода зависит от того, какие свойства вы хотите проверять - только собственные (own) или также унаследованные через prototype.
Оператор in проверяет наличие свойства как в самом объекте, так и в его prototype chain. Он вернёт true даже для свойств, унаследованных от Object.prototype, например toString.
Метод hasOwnProperty проверяет только собственные свойства объекта, игнорируя prototype chain. Однако он может быть переопределён в самом объекте, что приводит к ошибкам. Безопасный вызов - через Object.prototype.hasOwnProperty.call(obj, prop).
Сравнение с undefined - obj.prop !== undefined - проверяет, что значение свойства не undefined. Но это не гарантирует, что свойство существует: свойство может быть явно установлено в undefined, и тогда проверка даст ложный результат.
Object.hasOwn() (ES2022) - статический метод, аналогичный hasOwnProperty, но более безопасный: он не зависит от переопределения в объекте и работает корректно с объектами, созданными через Object.create(null).
На практике
Для production-кода на современном JavaScript (ES2022+) используйте Object.hasOwn(obj, prop) - это наиболее надёжный и читаемый способ проверки собственных свойств. Если нужно поддерживать старые браузеры, используйте Object.prototype.hasOwnProperty.call(obj, prop).
Оператор in применяйте, когда вам действительно нужно проверить свойство с учётом наследования, например, при работе с классами или prototype-based наследованием.
Сравнение с undefined избегайте для проверки существования свойства - используйте его только для проверки значения.
Пример кода
JAVASCRIPTconst obj = { ownProp: 42 };Object.setPrototypeOf(obj, { inheritedProp: 'test' });// Проверка собственных свойствconsole.log(Object.hasOwn(obj, 'ownProp')); // trueconsole.log(Object.hasOwn(obj, 'inheritedProp')); // falseconsole.log(obj.hasOwnProperty('ownProp')); // true// Проверка с учётом prototype chainconsole.log('ownProp' in obj); // trueconsole.log('inheritedProp' in obj); // trueconsole.log('toString' in obj); // true (унаследовано от Object.prototype)// Опасность сравнения с undefinedobj.undefinedProp = undefined;console.log(obj.undefinedProp !== undefined); // false (свойство существует!)console.log('undefinedProp' in obj); // true// Безопасный вызов hasOwnPropertyconst nullProtoObj = Object.create(null);nullProtoObj.test = 1;console.log(Object.prototype.hasOwnProperty.call(nullProtoObj, 'test')); // true// nullProtoObj.hasOwnProperty('test') // TypeError!
Как отвечать на собеседовании
Начните с перечисления основных способов, затем акцентируйте различие между собственными и унаследованными свойствами. Покажите понимание edge cases: объекты с Object.create(null), переопределённый hasOwnProperty, свойства со значением undefined. Упомяните современный стандарт Object.hasOwn() и его преимущества. Если спросят про производительность - скажите, что разница незначительна для большинства приложений, выбирайте по семантике.
Что проверяет интервьюер
- Понимание разницы между own и inherited properties
- Знание prototype chain и его влияния на проверку свойств
- Осведомлённость о современных возможностях ES2022
- Умение избегать типичных ошибок (переопределение методов, объекты без прототипа)
- Понимание, когда какой метод уместен
Типичные ошибки
- Использование
obj.hasOwnPropertyбез защиты от переопределения - Проверка через
!== undefinedкак универсальный способ - не работает для свойств со значениемundefined - Забывание про
Object.create(null)- вызовhasOwnPropertyна таких объектах падает с ошибкой - Путаница между
inиhasOwnProperty- использованиеinкогда нужны только собственные свойства - Предположение, что
Object.hasOwnподдерживается во всех средах (не поддерживается в IE)
> Похожие задачи по frontend
Как обрабатывать ошибки в промисах в JavaScript?
Что происходит при вызове методов объекта, объявленных разными способами в JavaScript
Какие методы для работы с массивами в JavaScript существуют и какие чаще используются
В чем разница между target и currentTarget в событиях JavaScript?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью