Skip to main content

Відсутність властивості

у JavaScript властивість може взагалі бути відсутньою, а може існувати, але мати значення undefined, і це дві різні ситуації!

Розберемо, як відрізнити їх.


1. Перевірка на існування властивості

Спершу згадаємо, як перевірити, чи є властивість в об'єкті:

javascript
'key' in obj // true, якщо властивість є (навіть якщо undefined) Object.hasOwn(obj, 'key') // те саме, тільки безпечніше

Але 'key' in obj не каже, чому дорівнює властивість, вона лише перевіряє, що ключ існує в об'єкті.


2. Перевірка, що властивість є, але дорівнює undefined

Приклад ситуації:

javascript
const obj = { a: undefined };

Тепер порівняємо з об'єктом без властивості:

javascript
const obj2 = {};

3. Різниця на практиці

javascript
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, потрібно:

javascript
if ('a' in obj && obj.a === undefined) { console.log('Властивість є, але значення undefined'); }

'a' in obj перевіряє наявність ключа, а obj.a === undefined перевіряє значення.


5. Приклад: порівняння всіх випадків

javascript
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Так

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.