Какие ограничения 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).