Как проверить, есть ли у объекта JavaScript определённое свойство?
Проверка существования свойства в объекте JavaScript
Вы правы: условие if (obj.prop) проверяет истинность значения, а не существование свойства. Если свойство есть, но его значение — 0, '', null, undefined, false или NaN, такое условие ложно. Для точной проверки существования свойства существует три основных подхода.
1. Оператор in
Оператор in возвращает true, если свойство существует в объекте (включая унаследованные свойства из прототипа).
const user = { name: 'Иван', age: 30, email: '' };
console.log('email' in user); // true (свойство есть)
console.log('phone' in user); // false (свойства нет)
Важно: in проверяет и унаследованные свойства. Например:
console.log('toString' in user); // true (унаследовано от Object.prototype)
2. Метод hasOwnProperty()
Метод hasOwnProperty() проверяет, является ли свойство собственным (не унаследованным). Это самый надёжный способ для вашей задачи.
const user = { name: 'Иван', age: 30, email: '' };
console.log(user.hasOwnProperty('email')); // true
console.log(user.hasOwnProperty('phone')); // false
console.log(user.hasOwnProperty('toString')); // false (унаследовано)
Использование в вашем примере:
if (user.hasOwnProperty('email')) {
console.log(user.email); // выведет пустую строку
} else {
console.log('Email не указан');
}
3. Сравнение с undefined
Можно проверить, не равно ли значение свойства undefined. Но этот способ ненадёжен, если свойство существует, но его значение явно установлено как undefined.
const user1 = { name: 'Иван' };
const user2 = { name: 'Иван', email: undefined };
console.log(user1.email !== undefined); // false (свойства нет)
console.log(user2.email !== undefined); // false (свойство есть, но значение undefined)
Как видите, для user2 результат ложный, хотя свойство существует. Поэтому этот способ лучше не использовать.
Рекомендация
- Для проверки собственных свойств — используйте
hasOwnProperty(). - Если нужно проверить и унаследованные свойства — используйте
in. - Не используйте проверку через
if (obj.prop)для определения существования свойства — это проверка на "истинность".
Дополнительно: в современных браузерах и Node.js можно использовать Object.hasOwn(obj, prop) — это статический метод, более безопасный, чем obj.hasOwnProperty() (защищает от переопределения метода).
console.log(Object.hasOwn(user, 'email')); // true
<<Альтернативный подход: проверка через Object.keys()
Если вам нужно не только проверить существование свойства, но и получить список всех собственных свойств объекта, можно использовать Object.keys() в комбинации с includes():
const user = { name: 'Иван', age: 30, email: '' };
const hasEmail = Object.keys(user).includes('email');
console.log(hasEmail); // true
Этот метод возвращает массив только собственных перечисляемых свойств (не унаследованных). Однако он менее эффективен, чем hasOwnProperty(), так как сначала создаёт массив всех ключей, а затем ищет в нём нужный. Для большинства повседневных задач это не критично, но при работе с большими объектами (тысячи свойств) лучше использовать hasOwnProperty() или Object.hasOwn().
Когда это может быть полезно:
- Вы хотите одновременно проверить несколько свойств.
- Вы уже используете
Object.keys()для других целей (например, для итерации). - Вам нужно убедиться, что свойство является перечисляемым (но это редкий случай).
В остальных случаях придерживайтесь основного подхода с hasOwnProperty() — это стандартный и самый читаемый способ.