PassFront
  1. PassFront
  2. База знаний
  3. Основы языка

Какие ограничения for of важно учитывать и как они влияют на решение?

Основы языка

Ограничения `for...of`: работает только с итерируемыми (не с обычными объектами), нельзя получить индекс напрямую (только через `entries`), и он не так гибок, как классический `for` для сложных сценариев.

Ограничения for...of

Не работает с обычными объектами

Обычные объекты не итерируемы — for...of по ним выдаст ошибку:

const obj = { a: 1, b: 2 };
for (const x of obj) {} // TypeError: obj is not iterable

Решение — Object.keys/values/entries:

for (const [key, value] of Object.entries(obj)) {}

Нет прямого доступа к индексу

for...of даёт значения, не индексы. Для индекса — entries:

for (const [i, value] of arr.entries()) {
  console.log(i, value);
}

Работает только с итерируемыми

Массивы, строки, Map, Set, arguments, NodeList, генераторы — да; произвольные объекты — нет (без Symbol.iterator).

Менее гибок, чем классический for

Нельзя произвольный шаг, обратный порядок, сложные условия — для этого нужен обычный for.

Как влияет на решение

  • Объекты → for...in или Object.entries + for...of.
  • Нужен индекс → entries() или классический for.
  • Сложная логика итерации → классический for.
  • Значения итерируемого без прерывания сложной логики → for...of (чисто, поддерживает break/await).

Плюсы for...of (для контекста)

Работает с break/continue/await (в отличие от forEach), читаемый.

Коротко для собеседования

Ограничения for...of: не работает с обычными объектами (не итерируемы — нужен Object.entries), нет прямого индекса (через .entries()), только для итерируемых (массивы, строки, Map, Set), менее гибок классического for (нет произвольного шага/порядка). Плюс — поддерживает break/await (в отличие от forEach).

Другие вопросы раздела