Что делает оператор in для объектов?

👨‍💻 Frontend Developer 🟠 Может встретиться 🎚️ Легкий
#JavaScript #Объекты #База JS

Краткий ответ

Оператор in проверяет, существует ли свойство в объекте или его цепочке прототипов. Он возвращает true, если свойство найдено, и false, если нет. Важно: он проверяет наличие свойства, а не его значение.

const user = { name: 'Иван' };
console.log('name' in user); // true
console.log('age' in user); // false

Полный ответ

Оператор [in] — это способ проверить, есть ли свойство у объекта. Он отличается от других способов проверки и имеет свои особенности.

Как работает оператор in

Проверяет наличие свойства в объекте и его прототипах:

const user = { name: 'Иван' };
console.log('name' in user); // true
console.log('age' in user); // false

Что проверяет оператор in

Наличие, а не значение

const obj = { 
  value: undefined,
  missing: undefined // На самом деле свойства нет
};
 
console.log('value' in obj); // true — свойство есть
console.log('missing' in obj); // false — свойства нет

Простые примеры

Проверка обычных свойств

const user = { name: 'Иван', age: 25 };
 
if ('name' in user) {
  console.log('Имя есть'); // Сработает
}
 
if ('phone' in user) {
  console.log('Телефон есть'); // Не сработает
}

Проверка унаследованных свойств

const obj = {};
// Все объекты имеют унаследованные методы
console.log('toString' in obj); // true
console.log('hasOwnProperty' in obj); // true

Важные особенности

1. Проверяет всю цепочку

const parent = { inherited: 'value' };
const child = Object.create(parent);
 
console.log('inherited' in child); // true — через прототип

2. Работает с переменными

const user = { name: 'Иван' };
const key = 'name';
 
console.log(key in user); // true

Когда использовать оператор in

Проверка возможных undefined значений

const obj = { value: undefined };
 
// ❌ Не работает правильно
if (obj.value) { /* не сработает */ }
 
// ✅ Правильно
if ('value' in obj) { /* сработает */ }

Работа с унаследованными свойствами

const arr = [1, 2, 3];
 
// Проверить, есть ли метод массива
if ('push' in arr) {
  console.log('Можно использовать push'); // Сработает
}

Частые ошибки

1. Путаница с hasOwnProperty

const obj = { name: 'Иван' };
 
// ❌ Проверяет только собственные свойства
console.log(obj.hasOwnProperty('toString')); // false
 
// ✅ Проверяет всё, включая унаследованное
console.log('toString' in obj); // true

2. Сравнение с undefined

const obj = { value: undefined };
 
// ❌ Не различает undefined и отсутствие свойства
if (obj.value === undefined) { /* не различает случаи */ }
 
// ✅ Правильно проверяет наличие
if ('value' in obj) { /* точно знает, есть свойство или нет */ }

Простые правила

  1. in — проверяет наличие свойства, а не значение
  2. Цепочка — ищет в объекте и его прототипах
  3. true/false — возвращает булево значение
  4. Переменные — можно использовать переменные как ключи
  5. Унаследованное — видит унаследованные свойства

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


Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪