← Назад к вопросам
Что происходит если нужно прочитать свойство объекта которое в нем отсутствует?
1.8 Middle🔥 111 комментариев
#JavaScript Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Чтение несуществующего свойства объекта
Когда вы пытаетесь прочитать свойство, которое не существует в объекте, JavaScript возвращает undefined.
Основное поведение
const user = {
name: 'Иван',
age: 30
};
console.log(user.name); // 'Иван'
console.log(user.email); // undefined
console.log(user['city']); // undefined
JavaScript не выбрасывает ошибку, а просто возвращает undefined.
Проверка существования свойства
1. Прямое сравнение с undefined
const user = { name: 'Иван' };
if (user.email !== undefined) {
console.log('Email существует');
} else {
console.log('Email не существует');
}
2. Оператор in
const user = { name: 'Иван' };
if ('email' in user) {
console.log('Email есть');
} else {
console.log('Email нет');
}
3. hasOwnProperty()
const user = { name: 'Иван' };
if (user.hasOwnProperty('email')) {
console.log('Это собственное свойство');
} else {
console.log('Это не собственное свойство');
}
4. Object.hasOwn() (современный способ)
const user = { name: 'Иван' };
if (Object.hasOwn(user, 'email')) {
console.log('Свойство существует');
}
Разница между undefined и несуществующим свойством
const obj = { a: undefined }; // свойство явно undefined
const empty = {}; // свойство не существует
console.log(obj.a); // undefined
console.log(empty.b); // undefined
console.log(obj.a === empty.b); // true (оба undefined)
// Но проверка разная:
console.log('a' in obj); // true (свойство есть)
console.log('b' in empty); // false (свойства нет)
console.log(obj.hasOwnProperty('a')); // true
console.log(empty.hasOwnProperty('b')); // false
Optional Chaining (?.)
Безопасное чтение вложенных свойств:
const user = {
profile: {
contact: {
email: 'ivan@example.com'
}
}
};
// Без optional chaining — ошибка если отсутствует промежуточное свойство
console.log(user.profile.social.vk); // TypeError!
// С optional chaining — вернет undefined
console.log(user.profile.social?.vk); // undefined
console.log(user.settings?.theme); // undefined
Nullish Coalescing (??)
Установка дефолтного значения:
const user = { name: 'Иван' };
const email = user.email ?? 'email@example.com';
console.log(email); // 'email@example.com'
// Или OR оператор (но работает иначе)
const city = user.city || 'Москва';
console.log(city); // 'Москва'
Получение всех свойств с проверкой
const user = { name: 'Иван', age: 30 };
function getProperty(obj, prop, defaultValue = undefined) {
return obj.hasOwnProperty(prop) ? obj[prop] : defaultValue;
}
console.log(getProperty(user, 'name')); // 'Иван'
console.log(getProperty(user, 'email')); // undefined
console.log(getProperty(user, 'email', 'default@example.com')); // 'default@example.com'
Различие: in vs hasOwnProperty
const parent = { parentProp: 'значение' };
const child = Object.create(parent);
child.ownProp = 'собственное';
// in проверяет и собственные, и унаследованные
console.log('ownProp' in child); // true
console.log('parentProp' in child); // true
// hasOwnProperty только собственные
console.log(child.hasOwnProperty('ownProp')); // true
console.log(child.hasOwnProperty('parentProp')); // false
Практический пример
function getUserInfo(user) {
const name = user.name ?? 'Неизвестный пользователь';
const email = user.email ?? 'email@example.com';
const role = user.role ?? 'user';
if (!('settings' in user)) {
user.settings = {};
}
return { name, email, role, settings: user.settings };
}
const result = getUserInfo({ name: 'Иван' });
console.log(result);
Ключевые моменты
✅ Когда читаешь несуществующее свойство:
- Возвращается undefined
- НЕ выбрасывается ошибка
- Скрипт продолжает работу
✅ Для проверки свойства используй:
- obj.hasOwnProperty(prop) — проверка собственных свойств
- prop in obj — проверка собственных и унаследованных
- Object.hasOwn(obj, prop) — современный способ
✅ Для безопасного доступа используй:
- obj?.prop — optional chaining
- obj.prop ?? defaultValue — nullish coalescing
JavaScript по умолчанию дружелюбен к отсутствующим свойствам и возвращает undefined вместо ошибки.