Відсутність властивості
у JavaScript властивість може взагалі бути відсутньою,
а може існувати, але мати значення undefined,
і це дві різні ситуації!
Розберемо, як відрізнити їх.
1. Перевірка на існування властивості
Спершу згадаємо, як перевірити, чи є властивість в об'єкті:
'key' in obj // true, якщо властивість є (навіть якщо undefined)
Object.hasOwn(obj, 'key') // те саме, тільки безпечнішеАле 'key' in obj не каже, чому дорівнює властивість,
вона лише перевіряє, що ключ існує в об'єкті.
2. Перевірка, що властивість є, але дорівнює undefined
Приклад ситуації:
const obj = {
a: undefined
};Тепер порівняємо з об'єктом без властивості:
const obj2 = {};3. Різниця на практиці
console.log('a' in obj); // true (властивість є)
console.log('a' in obj2); // false (властивості немає)
console.log(obj.a === undefined); // true
console.log(obj2.a === undefined); // true (обидва дають true!)Проблема:
проста перевірка obj.a === undefined не відрізняє
"відсутність властивості" від "властивість є, але undefined".
4. Рішення - комбінувати перевірки
Щоб точно дізнатися, що властивість є і дорівнює undefined, потрібно:
if ('a' in obj && obj.a === undefined) {
console.log('Властивість є, але значення undefined');
}'a' in obj перевіряє наявність ключа,
а obj.a === undefined перевіряє значення.
5. Приклад: порівняння всіх випадків
const data = {
a: undefined,
b: 10
};
console.log('a' in data, data.a); // true, undefined
console.log('b' in data, data.b); // true, 10
console.log('c' in data, data.c); // false, undefinedТільки 'a' in data поверне true,
означаючи, що ключ є, навіть якщо його значення undefined.
Підсумок
| Перевірка | Що робить | Відрізняє наявність ключа? |
|---|---|---|
obj.key === undefined | Перевіряє лише значення | Ні |
'key' in obj | Перевіряє, чи є ключ | Так |
'key' in obj && obj.key === undefined | Перевіряє обидві умови | Так |
Object.hasOwn(obj, 'key') | Сучасний аналог in | Так |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.