← Назад к вопросам

Что происходит если нужно прочитать свойство объекта которое в нем отсутствует?

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 вместо ошибки.

Что происходит если нужно прочитать свойство объекта которое в нем отсутствует? | PrepBro