Как проверить наличие поля (свойства) у объекта в JavaScript?

Ответ

В JavaScript есть несколько методов, различающихся по смыслу и надёжности.

1. Оператор in Проверяет наличие свойства в самом объекте или в его цепочке прототипов.

const obj = { name: 'Alice' };
console.log('name' in obj); // true
console.log('toString' in obj); // true (унаследовано от Object.prototype)

2. Метод Object.hasOwn() (ES2022) или obj.hasOwnProperty() Проверяет только собственные (не унаследованные) свойства объекта.

const obj = { name: 'Alice' };
console.log(Object.hasOwn(obj, 'name')); // true (рекомендуемый современный способ)
console.log(obj.hasOwnProperty('name')); // true
console.log(obj.hasOwnProperty('toString')); // false

3. Сравнение с undefined (с осторожностью) Может не сработать, если свойство существует, но его значение явно установлено в undefined.

const obj = { name: undefined };
console.log(obj.name !== undefined); // false, хотя свойство существует!

4. Опциональная цепочка (?.) с последующей проверкой Удобный и безопасный способ для глубоко вложенных свойств.

const user = { profile: { name: 'Bob' } };
if (user?.profile?.name !== undefined) {
  // Свойство существует и не равно undefined
}

Для других структур:

  • Map: Используйте метод .has(key).
  • Set: Используйте метод .has(value).
  • Array: Для индексов используйте index in array или сравнение index < array.length.

Ответ 18+ 🔞

Слушай, ну это ж классика, ёпта! В JavaScript проверка свойств — это как в жизни: можно спросить у человека напрямую, а можно по цепочке родственников допросить, пока не выяснишь, есть ли у него эта самая «характерная черта». Только вот методы все разные, и надёжность у них — доверия ебать ноль, если не знать, какой когда использовать.

1. Оператор in — самый любопытный сосед Этот оператор лезет везде, куда может. Проверяет свойство и в самом объекте, и во всей его прототипной родне, до самого верха. Как будто спрашиваешь: «Эй, у тебя есть ключи от машины?» — а он тебе: «Нет, но у моего деда в гараже точно были!». И считается, что есть.

const obj = { name: 'Alice' };
console.log('name' in obj); // true (ну логично, своё)
console.log('toString' in obj); // true (а это уже от прадеда Object.prototype унаследовал, хитрая жопа!)

2. Object.hasOwn() или старый добрый hasOwnProperty() — строгий отец А вот эти ребята проверяют только собственные свойства. Никаких наследственных прибамбасов! Современный Object.hasOwn(obj, 'prop') — это как смартфон последней модели, а obj.hasOwnProperty('prop') — как старенький, но рабочий Nokia. Оба делают одно и то же, но первый надёжнее, если кто-то мог переписать hasOwnProperty в объекте (бывает же такое, пидарас шерстяной).

const obj = { name: 'Alice' };
console.log(Object.hasOwn(obj, 'name')); // true (рекомендую, модно и безопасно)
console.log(obj.hasOwnProperty('name')); // true (работает, но старовато)
console.log(obj.hasOwnProperty('toString')); // false (а это уже не его, дедовское, не считается)

3. Сравнение с undefined — игра в русскую рулетку Ну, тут всё просто: если свойство есть, но его значение — undefined, то ты нихуя не поймёшь. Как будто заглянул в холодильник, а там пусто. Но ты не знаешь, то ли там никогда ничего не было, то ли только что последнюю колбаску сожрали.

const obj = { name: undefined };
console.log(obj.name !== undefined); // false, охуеть! Свойство-то есть, но значение undefined, вот и облом.

4. Опциональная цепочка (?.) с проверкой — умный и осторожный Идеально для случаев, когда лезешь в глубоко вложенные структуры, а вдруг на каком-то уровне null или undefined? Эта штука не сломается, а просто вернёт undefined и всё. А ты потом проверяй, что получилось.

const user = { profile: { name: 'Bob' } };
if (user?.profile?.name !== undefined) {
  // Ура, свойство существует и не пустое! Можно работать.
}

А для других коллекций — свои правила, ёбана!

  • Map: Тут не фиг баловаться, используй родной .has(key). Быстро и чётко.
  • Set: То же самое — .has(value). Никаких самодеятельностей.
  • Array: Для индексов либо index in array (но он тоже по цепочке прототипов может шарить, осторожно!), либо классика — index < array.length. Второе — как проверка, влезешь ли ты в старые джинсы: если индекс меньше длины, то да.

Короче, выбирай инструмент по ситуации, а то можно такого наворотить, что потом сам от себя охуеешь.