Оператор in в JavaScript

Оператор in проверяет, есть ли свойство в объекте. Если свойство есть, результатом будет true. Если свойства нет - false.

let user = {
  name: 'Анна',
  age: 25
};

console.log('name' in user);
console.log('email' in user);

Результат:

true
false

Свойство name есть в объекте user, а свойства email нет.

Что делает оператор in

Оператор in проверяет именно наличие свойства, а не его значение.

let user = {
  name: 'Анна'
};

console.log('name' in user);

Результат:

true

Можно читать так: есть ли свойство ‘name’ в объекте user?

Синтаксис

'propertyName' in object

Слева указывается имя свойства, справа - объект, в котором нужно выполнить проверку.

let student = {
  course: 'JavaScript'
};

console.log('course' in student);

Результат:

true

Имя свойства обычно записывают строкой. Если имя лежит в переменной, кавычки не нужны.

let key = 'course';

console.log(key in student);

Проверка свойства в объекте

in удобно использовать, когда нужно понять, есть ли в объекте нужное поле.

let student = {
  name: 'Иван',
  group: 'JS-1'
};

if ('group' in student) {
  console.log('Группа указана');
}

Если свойство group есть, код внутри if выполнится.

Оператор работает и со свойствами, в названии которых есть пробелы:

let student = {
  name: 'Иван',
  'work experience': 1
};

console.log('work experience' in student);

Результат:

true

undefined и наличие свойства

Иногда свойство есть, но его значение равно undefined.

let user = {
  name: 'Анна',
  email: undefined
};

console.log(user.email);
console.log('email' in user);

Результат:

undefined
true

Значение свойства email равно undefined, но само свойство в объекте есть. Поэтому оператор in возвращает true.

Если проверять только так, можно получить неточный вывод:

if (user.email === undefined) {
  console.log('Email не указан');
}

Такая проверка не отличает две ситуации: свойства нет вообще или свойство есть, но в нем лежит undefined.

Оператор in в условиях

Оператор in часто используют внутри if.

let settings = {
  theme: 'dark'
};

if ('theme' in settings) {
  console.log('Тема выбрана');
} else {
  console.log('Использовать тему по умолчанию');
}

Если свойство есть, выполняется первый блок. Если свойства нет - блок else.

Оператор in и массивы

С массивами in проверяет наличие индекса, а не значение внутри массива.

let colors = ['red', 'green'];

console.log(0 in colors);
console.log(1 in colors);
console.log(2 in colors);

Результат:

true
true
false

В массиве есть элементы с индексами 0 и 1, но нет элемента с индексом 2.

Если нужно проверить, есть ли в массиве значение, оператор in не подходит. Для этого обычно используют методы массивов, например includes().

console.log(colors.includes('red'));

Свойства из прототипа

Оператор in проверяет не только собственные свойства объекта, но и свойства из прототипа.

let user = {
  name: 'Анна'
};

console.log('name' in user);
console.log('toString' in user);

Результат:

true
true

Свойство name находится прямо в объекте. А toString приходит из прототипа, но оператор in все равно возвращает true.

На первых уроках чаще всего достаточно помнить простое правило: in отвечает на вопрос «есть ли такое свойство у объекта или в его цепочке прототипов».

Итого

Оператор in проверяет наличие свойства в объекте и возвращает true или false. Он полезен, когда нужно отличить отсутствующее свойство от свойства со значением undefined. С массивами in проверяет индексы, а не значения. Также важно не путать оператор in с циклом for…in: оператор проверяет наличие свойства, а цикл перебирает свойства объекта.