JS циклы
Циклы в JavaScript — управляющие конструкции для многократного выполнения блока кода:
for,while,do...while,for...of,for...in.
Зачем нужно
Циклы необходимы для обхода коллекций, повторения операций, реализации алгоритмов. Правильный выбор типа цикла делает код читаемым и производительным. for...of — современный способ обхода итерируемых объектов (массивы, строки, Map, Set), заменяет устаревший for...in для массивов. Понимание break, continue и меток важно для выхода из вложенных циклов.
Где используется
- Обход массивов и коллекций: рендер списков, трансформация данных
- Алгоритмы: сортировка, поиск, накопление результата
- Опрос условий: ожидание события, retry-логика
- Обход свойств объекта (for...in)
- Работа с генераторами и итерируемыми объектами (for...of)
Основной контент
for — классический цикл
// Базовый синтаксис: инициализация; условие; шаг
for (let i = 0; i < 5; i++) {
console.log(i); // 0, 1, 2, 3, 4
}
// Обход массива по индексу
const fruits = ['яблоко', 'банан', 'вишня'];
for (let i = 0; i < fruits.length; i++) {
console.log(`${i}: ${fruits[i]}`);
}
// Обратный обход
for (let i = fruits.length - 1; i >= 0; i--) {
console.log(fruits[i]); // вишня, банан, яблоко
}
for...of — обход итерируемых объектов
// Массив
for (const fruit of fruits) {
console.log(fruit);
}
// С индексом через entries
for (const [index, fruit] of fruits.entries()) {
console.log(`${index}: ${fruit}`);
}
// Строка
for (const char of 'hello') {
console.log(char); // 'h', 'e', 'l', 'l', 'o'
}
// Map
const map = new Map([['a', 1], ['b', 2]]);
for (const [key, value] of map) {
console.log(key, value);
}
// Set
const set = new Set([1, 2, 3]);
for (const val of set) {
console.log(val);
}
for...in — обход свойств объекта
const user = { name: 'Иван', age: 30, city: 'Москва' };
// for...in перебирает ВСЕ перечисляемые свойства, включая унаследованные
for (const key in user) {
if (Object.hasOwn(user, key)) { // только собственные свойства
console.log(`${key}: ${user[key]}`);
}
}
// Не используйте for...in для массивов — порядок не гарантирован,
// могут попасть добавленные через prototype свойства
while и do...while
// while — проверка условия ПЕРЕД итерацией
let count = 0;
while (count < 3) {
console.log(count++); // 0, 1, 2
}
// do...while — проверка условия ПОСЛЕ итерации (выполняется хотя бы раз)
let input;
do {
input = prompt('Введите число больше 0:');
} while (input <= 0);
// Retry-логика
async function fetchWithRetry(url, retries = 3) {
let attempt = 0;
while (attempt < retries) {
try {
return await fetch(url);
} catch (err) {
attempt++;
if (attempt === retries) throw err;
}
}
}
break, continue и метки
// break — выход из цикла
for (let i = 0; i < 10; i++) {
if (i === 5) break;
console.log(i); // 0, 1, 2, 3, 4
}
// continue — пропустить итерацию
for (let i = 0; i < 5; i++) {
if (i % 2 === 0) continue;
console.log(i); // 1, 3
}
// Метки — выход из вложенных циклов
outer: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
if (i === 1 && j === 1) break outer; // выходим из обоих циклов
console.log(i, j);
}
}
Частые ошибки
for...inдля массивов: порядок элементов не гарантирован стандартом (на практике обычно правильный, но не всегда), и могут попасть прототипные свойства. Используйтеfor...ofилиforEach.- Бесконечный цикл: забыть обновить счётчик или условие всегда истинно — вкладка браузера зависает. Проверяйте условие выхода.
- Модификация массива в цикле: добавление/удаление элементов во время
forпо индексу ломает обход — итерируйте по копии или используйтеfilter/map. letvsvarв for:varв цикле — одна переменная для всех итераций (проблема в setTimeout/Promise). Всегда используйтеlet.
Связанные темы
Ресурсы
🎓 Источник: Итерирование, циклы и итераторы в JavaScript
- 📅 2018-11-05 · YouTube
- Тезисы: циклы — это императивный синтаксис. Итераторы (
Symbol.iterator) — декларативный протокол.for...ofработает через iterator protocol — поэтому работает с любым iterable (Map, Set, NodeList)
⚡ Источник: ⎡dlgs02⎦ JavaScript Беседы Reduce, For, Wasm · AsForJS
- 📅 2023-11-19 · YouTube
- Тезисы: обзорный диалог.
for— самый прямой к байткоду цикл.for...ofсоздаёт IteratorRecord — медленнее на простых массивах.forEachчерез callback — медленнееforв горячих местах
⚡ Источник: Производительность for, forEach и reduce · AsForJS
- 📅 2026-04-14 · YouTube
- Тезисы: замеры показывают:
for(i=0;...)≈for...of(после JIT) >forEach>reduce. Разница важна только на >10⁵ элементах