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

Что такое for in?

1.0 Junior🔥 111 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое for...in в JavaScript

for...in — это цикл в JavaScript, который итерирует по ключам (именам свойств) объекта или элементам массива. Это один из способов перебора объектов, но его нужно использовать осторожно.

Синтаксис

for (let key in object) {
  console.log(key); // Ключ свойства
  console.log(object[key]); // Значение свойства
}

Примеры использования

Итерация по объекту

const user = {
  name: "Алиса",
  age: 25,
  email: "alice@example.com"
};

for (let key in user) {
  console.log(key + ": " + user[key]);
}

// Результат:
// name: Алиса
// age: 25
// email: alice@example.com

Итерация по массиву (не рекомендуется)

const fruits = ["яблоко", "банан", "апельсин"];

for (let index in fruits) {
  console.log(index + ": " + fruits[index]);
}

// Результат:
// 0: яблоко
// 1: банан
// 2: апельсин

Важные особенности for...in

1. Итерирует по наследованным свойствам

const parent = {
  inherited: "значение из parent"
};

const child = Object.create(parent);
child.own = "собственное свойство";

for (let key in child) {
  console.log(key); // own, inherited (оба!)
}

// Если нужны только собственные свойства:
for (let key in child) {
  if (child.hasOwnProperty(key)) {
    console.log(key); // только own
  }
}

2. Порядок ключей может быть непредсказуем

const obj = {
  z: 1,
  a: 2,
  m: 3
};

for (let key in obj) {
  console.log(key);
}

// Результат может быть не в порядке определения
// (особенно в старых браузерах)

3. Перебирает все перечисляемые свойства

const obj = {};
Object.defineProperty(obj, "hidden", {
  value: "я не буду видна",
  enumerable: false
});
obj.visible = "я видна";

for (let key in obj) {
  console.log(key); // только visible
}

Проблемы с for...in

Проблема 1: Неожиданные наследованные свойства

const settings = {
  theme: "dark",
  language: "русский"
};

// Кто-то добавляет свойство в prototype
Object.prototype.newFeature = true;

for (let key in settings) {
  console.log(key);
}

// Результат:
// theme
// language
// newFeature (неожиданно!)

Проблема 2: С массивами это ненадежно

const arr = ["a", "b", "c"];
arr.customProperty = "я не часть массива";

for (let index in arr) {
  console.log(index);
}

// Результат:
// 0
// 1
// 2
// customProperty (не то, что нам нужно!)

for...in vs Альтернативы

for...in (для объектов)

for (let key in obj) {
  console.log(key);
}

Object.keys() (рекомендуется для объектов)

const obj = {a: 1, b: 2, c: 3};

for (let key of Object.keys(obj)) {
  console.log(key);
}

// Или с forEach:
Object.keys(obj).forEach(key => {
  console.log(key);
});

Object.entries() (удобнее, если нужны ключи и значения)

const user = {name: "Боб", age: 30};

for (let [key, value] of Object.entries(user)) {
  console.log(key + ": " + value);
}

// Результат:
// name: Боб
// age: 30

for...of (для массивов)

const fruits = ["яблоко", "банан", "апельсин"];

for (let fruit of fruits) {
  console.log(fruit);
}

// Результат:
// яблоко
// банан
// апельсин

forEach (функциональный подход)

const arr = [10, 20, 30];

arr.forEach((item, index) => {
  console.log(index + ": " + item);
});

Таблица сравнения

Метод         | Объекты | Массивы | Наследованные | Порядок
------------------------------------------------------------------
for...in      | Да      | Плохо   | Да            | Непредсказуем
Object.keys   | Да      | Хорошо  | Нет           | Определен
Object.entries| Да      | Хорошо  | Нет           | Определен
for...of      | Нет     | Да      | Нет           | Определен
forEach       | Нет     | Да      | Нет           | Определен

Когда использовать for...in

for...in полезен, когда:

  • Нужно итерировать по объекту со своими свойствами
  • Вы уверены, что прототип не загрязнен
  • Вам не важен порядок
// Хороший пример: обход конфигурации
const config = {
  apiUrl: "https://api.example.com",
  timeout: 5000,
  retries: 3
};

for (let option in config) {
  if (config.hasOwnProperty(option)) {
    console.log(option + " = " + config[option]);
  }
}

Современный подход

// Объекты
const obj = {x: 1, y: 2};
Object.entries(obj).forEach(([key, value]) => {
  console.log(`${key}: ${value}`);
});

// Массивы
const arr = ["a", "b", "c"];
arr.forEach((item, index) => {
  console.log(`${index}: ${item}`);
});

// for...of с entries()
for (const [index, item] of arr.entries()) {
  console.log(`${index}: ${item}`);
}

Заключение

for...in — это инструмент для итерации по ключам объекта, но он имеет подводные камни при использовании с массивами и наследованием. В современном JavaScript предпочитают Object.keys(), Object.entries(), for...of и forEach() как более явные и безопасные варианты.