> Как проверить наличие свойства в объекте в 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 избегайте для проверки существования свойства - используйте его только для проверки значения.

Пример кода

JAVASCRIPT
const obj = { ownProp: 42 };
Object.setPrototypeOf(obj, { inheritedProp: 'test' });
// Проверка собственных свойств
console.log(Object.hasOwn(obj, 'ownProp')); // true
console.log(Object.hasOwn(obj, 'inheritedProp')); // false
console.log(obj.hasOwnProperty('ownProp')); // true
// Проверка с учётом prototype chain
console.log('ownProp' in obj); // true
console.log('inheritedProp' in obj); // true
console.log('toString' in obj); // true (унаследовано от Object.prototype)
// Опасность сравнения с undefined
obj.undefinedProp = undefined;
console.log(obj.undefinedProp !== undefined); // false (свойство существует!)
console.log('undefinedProp' in obj); // true
// Безопасный вызов hasOwnProperty
const 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)

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

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