Проверка существования ключа в объекте JavaScript: 3 способа для новичков

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Проверка существования ключа в объекте JavaScript: разбор для начинающих

Вы когда-нибудь пытались получить значение из объекта JavaScript, а в ответ получали загадочное undefined? Знакомая ситуация, правда? Особенно когда работаешь с данными из API, конфигами или просто большими структурами. Сегодня мы раз и навсегда разберемся, как грамотно проверить, существует ли ключ в объекте. Это один из самых популярных вопросов на Stack Overflow — и неспроста.

Представьте, что объект — это шкаф с ящиками. Вы хотите узнать, есть ли в нем ящик с надписью "ключи". Можно просто дернуть за ручку (и получить ошибку, если ящика нет), а можно сначала заглянуть и убедиться. В JavaScript у нас есть целых три надежных способа это сделать. Поехали!

Зачем вообще проверять наличие ключа?

Допустим, вы пишете приложение для списка покупок. У вас есть объект cart, который может содержать товары с количеством:

const cart = {
  apples: 3,
  bananas: 5
};

// Хотим добавить груши, но не знаем, есть ли они уже
function addItem(item, quantity) {
  if (cart[item] !== undefined) {
    cart[item] += quantity;
  } else {
    cart[item] = quantity;
  }
}

Этот код сработает, но у него есть подводные камни. Что если значение ключа — 0 или null? Тогда проверка на undefined даст ложный результат. Поэтому давайте разберем профессиональные подходы.

Метод 1: Оператор in — универсальный солдат

Оператор in проверяет, существует ли свойство в объекте, включая унаследованные свойства. Это самый надежный способ, когда вам нужно узнать, есть ли ключ вообще.

const user = {
  name: 'Анна',
  age: 25,
  isAdmin: false
};

console.log('name' in user);    // true
console.log('age' in user);     // true
console.log('salary' in user);  // false
console.log('toString' in user); // true (унаследовано от Object)

Плюсы: работает даже если значение — null, undefined или false. Проверяет всю цепочку прототипов.

Минусы: может найти унаследованные свойства, которые вам не нужны. Например, toString или hasOwnProperty.

Для большинства случаев in — идеальный выбор. Особенно когда вы работаете с обычными объектами-словарями.

Метод 2: hasOwnProperty() — только свои ключи

Если вам нужно проверить только собственные свойства объекта (не унаследованные), используйте метод hasOwnProperty. Это стандартный метод всех объектов в JavaScript.

const book = {
  title: 'JavaScript для чайников',
  pages: 300
};

console.log(book.hasOwnProperty('title'));   // true
console.log(book.hasOwnProperty('pages'));   // true
console.log(book.hasOwnProperty('toString')); // false (не собственное свойство)
console.log(book.hasOwnProperty('author'));   // false

Обратите внимание: hasOwnProperty не проверяет унаследованные свойства. Это делает его незаменимым, когда вы создаете объекты с помощью классов или прототипов.

Но есть нюанс! Если ваш объект был создан с помощью Object.create(null), у него не будет метода hasOwnProperty. Что делать? Используйте безопасный вызов:

const dict = Object.create(null);
dict.key1 = 'value1';

// Так не сработает:
// console.log(dict.hasOwnProperty('key1')); // TypeError

// А так — да:
console.log(Object.prototype.hasOwnProperty.call(dict, 'key1')); // true

Современный синтаксис позволяет использовать Object.hasOwn() — статический метод, добавленный в ES2022. Он решает эту проблему элегантно:

console.log(Object.hasOwn(dict, 'key1')); // true

Рекомендую использовать Object.hasOwn() для новых проектов — он и читается лучше, и работает без риска переопределения.

Метод 3: Проверка на undefined — быстро, но с оговорками

Самый интуитивный способ: просто получить значение и проверить, не равно ли оно undefined.

const config = {
  theme: 'dark',
  fontSize: null,
  showFooter: false
};

console.log(config.theme !== undefined);     // true
console.log(config.fontSize !== undefined);  // true (null — это не undefined)
console.log(config.showFooter !== undefined); // true (false — это не undefined)
console.log(config.background !== undefined); // false

На первый взгляд всё работает. Но есть подвох: что если свойство существует, но его значение буквально равно undefined? Такое бывает, если вы явно присвоили:

const obj = {
  key: undefined
};

console.log(obj.key !== undefined); // false — хотя ключ существует!

Поэтому этот метод стоит использовать только когда вы точно знаете, что значения не могут быть undefined. Для быстрых скриптов — окей, для production-кода — лучше выбрать in или hasOwn.

Сравнительная таблица: что выбрать?

Чтобы вам было проще ориентироваться, вот краткая шпаргалка:

Метод Проверяет унаследованные Работает с null/undefined Безопасен для Object.create(null)
in Да Да Да
hasOwnProperty() Нет Да Нет (без Object.hasOwn)
Object.hasOwn() Нет Да Да
!== undefined Да Нет (ошибка при undefined) Да

Практический пример: фильтрация данных

Представьте, что вы получаете массив пользователей из API, и некоторые поля могут отсутствовать. Нужно отфильтровать только тех, у кого есть email:

const users = [
  { id: 1, name: 'Иван', email: 'ivan@mail.ru' },
  { id: 2, name: 'Мария' }, // без email
  { id: 3, name: 'Петр', email: null }, // email есть, но null
  { id: 4, name: 'Ольга', email: '' } // пустая строка
];

// Вариант 1: проверяем существование ключа
const withEmailKey = users.filter(user => 'email' in user);
console.log(withEmailKey.length); // 4 — все имеют ключ email

// Вариант 2: проверяем,                

Блоги

Рекомендаций по книгам