Наявність властивості в об'єкті
У JavaScript є кілька способів перевірити, чи є в об'єкті та чи інша властивість. Кожен із них працює трохи по-різному: розберемо всі, з прикладами і нюансами.
1. Оператор in
Найпряміший і найнадійніший спосіб.
const user = { name: 'Oleh', age: 25 };
console.log('name' in user); // true
console.log('email' in user); // falseПеревіряє, чи існує властивість узагалі (включно з успадкованими від прототипу).
Приклад зі спадкуванням
const person = { isHuman: true };
const user = Object.create(person);
user.name = 'Oleh';
console.log('name' in user); // true (власна)
console.log('isHuman' in user); // true (успадкована)2. Метод hasOwnProperty()
Перевіряє лише власні властивості (тобто ті, що реально належать самому об'єкту, а не прототипу).
const person = { isHuman: true };
const user = Object.create(person);
user.name = 'Oleh';
console.log(user.hasOwnProperty('name')); // true
console.log(user.hasOwnProperty('isHuman')); // falseВикористовуй, якщо потрібно переконатися, що властивість визначена в самому об'єкті, а не успадкована.
Обережно:
Якщо хтось перевизначив hasOwnProperty, його краще викликати так:
Object.prototype.hasOwnProperty.call(user, 'name');3. Перевірка через undefined
Простий, але не завжди безпечний спосіб:
const user = { name: 'Oleh' };
console.log(user.name !== undefined); // true
console.log(user.email !== undefined); // falseПроблема: властивість може існувати, але мати значення
undefined.
const user = { name: undefined };
console.log('name' in user); // true
console.log(user.name !== undefined); // false (обманює)4. Метод Object.hasOwn() (сучасний, ES2022)
Це "нова версія" hasOwnProperty,
але безпечніша (не залежить від ланцюжка прототипів).
const user = { name: 'Oleh' };
console.log(Object.hasOwn(user, 'name')); // true
console.log(Object.hasOwn(user, 'email')); // falseРекомендується використовувати замість
hasOwnProperty()у сучасному коді.
Порівняння способів
| Метод | Перевіряє успадковані властивості | Перевіряє лише свої | Безпечний для будь-яких об'єктів | Приклад |
|---|---|---|---|---|
'key' in obj | Так | Ні | Так | 'name' in user |
obj.hasOwnProperty('key') | Ні | Так | Не завжди (може бути перевизначений) | user.hasOwnProperty('name') |
Object.hasOwn(obj, 'key') | Ні | Так | Так | Object.hasOwn(user, 'name') |
obj.key !== undefined | Не завжди | Ні | Так | user.name !== undefined |
5. Перевірка через Reflect.has() (альтернатива in)
Ще один варіант (з Reflect API):
const user = { name: 'Oleh' };
console.log(Reflect.has(user, 'name')); // true
console.log(Reflect.has(user, 'email')); // falseПрацює точно як
in, але зручний у "рефлексивному" (метапрограмному) коді.
Підсумок
| Мета | Найкращий спосіб |
|---|---|
| Перевірити будь-яку властивість (включно з прототипами) | 'prop' in obj |
| Перевірити лише власну властивість | Object.hasOwn(obj, 'prop') |
| Підтримка старих браузерів | obj.hasOwnProperty('prop') |
Перевірити, що значення не undefined | obj.key !== undefined (обережно) |
Коротко
in: перевіряє наявність властивості (у тому числі успадкованої).hasOwnProperty(): перевіряє лише власні властивості.Object.hasOwn(): сучасна і безпечна альтернатива.- Перевірка
!== undefinedне завжди коректна.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.