> Можно ли использовать цикл for...of для перебора ключей объекта в JavaScript? (JavaScript)

Уровень: middle · Роль: frontend · Категория: Технические вопросы

Компании: The Tribe, Яндекс

Стек: JavaScript

> Пример ответа

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

Нет, for...of не предназначен для перебора ключей объекта. Он работает с итерируемыми объектами (массивы, строки, Map, Set), а обычные объекты не являются итерируемыми. Для перебора ключей объекта следует использовать for...in, Object.keys(), Object.values() или Object.entries().

Подробное объяснение

Цикл for...of появился в ES6 и предназначен для обхода итерируемых объектов - тех, у которых реализован Symbol.iterator. Обычные объекты JavaScript не имеют этого символа по умолчанию, поэтому попытка использовать for...of вызовет TypeError: obj is not iterable.

Для перебора ключей объекта существуют другие инструменты:

  • for...in - перебирает все перечисляемые свойства, включая унаследованные
  • Object.keys(obj) - возвращает массив собственных ключей
  • Object.getOwnPropertyNames(obj) - возвращает все собственные ключи, включая неперечисляемые

Если очень нужно сделать объект итерируемым, можно вручную добавить Symbol.iterator, но на практике это редко оправдано.

На практике

В реальной фронтенд-разработке for...of используется для массивов, NodeList (через Array.from), Map и Set. Для объектов всегда применяйте Object.keys() с forEach или for...in с проверкой hasOwnProperty.

Пример типичной задачи: нужно пройтись по конфигурационному объекту и применить настройки. Здесь for...of не подходит, используйте Object.entries().

Пример кода

JAVASCRIPT
// ❌ Ошибка: объект не итерируем
const obj = { a: 1, b: 2 };
// for (const key of obj) {} // TypeError
// ✅ Правильные подходы
// 1. for...in (осторожно с прототипом)
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
console.log(key, obj[key]);
}
}
// 2. Object.keys() + for...of (рекомендуется)
for (const key of Object.keys(obj)) {
console.log(key, obj[key]);
}
// 3. Object.entries() + деструктуризация
for (const [key, value] of Object.entries(obj)) {
console.log(key, value);
}
// 4. Object.keys() + forEach
Object.keys(obj).forEach(key => {
console.log(key, obj[key]);
});

Как отвечать на собеседовании

Начни с прямого ответа: нет, нельзя. Объясни причину - отсутствие итератора у обычных объектов. Перечисли альтернативы: for...in, Object.keys(), Object.entries(). Упомяни нюанс с for...in и унаследованными свойствами. Если собеседник спросит про исключения - скажи, что можно сделать объект итерируемым через Symbol.iterator, но это редкий кейс.

Что проверяет интервьюер

  • Понимание разницы между итерируемыми и неитерируемыми объектами
  • Знание протокола итерации (Symbol.iterator)
  • Умение выбирать правильный инструмент для задачи
  • Осведомленность о нюансах for...in (hasOwnProperty)
  • Знание современных методов Object.keys/values/entries

Типичные ошибки

  • Попытка использовать for...of с обычным объектом без предварительной конвертации
  • Забывают, что for...in перебирает унаследованные свойства
  • Путают for...in (ключи) и for...of (значения)
  • Думают, что Object.keys() возвращает итератор (на самом деле массив)
  • Используют for...of с объектом, не проверив его итерируемость

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью