Урок 06

Циклы

for

for (let i = 0; i < 5; i++) {
    console.log(i);
}

Три части: инициализация, условие, шаг.

Обратный:

for (let i = 5; i > 0; i--) {
    console.log(i);
}

while

let i = 0;
while (i < 5) {
    console.log(i);
    i++;
}

Проверяет условие до тела.

do...while

let i = 0;
do {
    console.log(i);
    i++;
} while (i < 5);

Проверяет условие после тела. Выполнится хотя бы раз.

for...of

Для итерации по массивам, строкам, Map, Set:

const items = ['a', 'b', 'c'];

for (const item of items) {
    console.log(item);
}

for (const char of 'hello') {
    console.log(char);
}

С индексом:

for (const [index, item] of items.entries()) {
    console.log(index, item);
}

for...in

Для итерации по ключам объекта:

const user = { name: 'Алиса', age: 25 };

for (const key in user) {
    console.log(key, user[key]);
}

Включает унаследованные свойства. Проверка:

for (const key in user) {
    if (Object.hasOwn(user, key)) {
        console.log(key);
    }
}

Не используй for...in для массивов — порядок не гарантирован, попадут индекс-строки.

forEach

Метод массива:

const items = ['a', 'b', 'c'];

items.forEach((item, index) => {
    console.log(index, item);
});

Нельзя прервать через break или return.

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 < 10; i++) {
    if (i % 2 === 0) continue;
    console.log(i); // 1, 3, 5, 7, 9
}

Метки

Выход из вложенных циклов:

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);
    }
}

Используется редко.

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

Современные способы:

const user = { name: 'Алиса', age: 25 };

Object.keys(user).forEach((key) => console.log(key));
Object.values(user).forEach((value) => console.log(value));
Object.entries(user).forEach(([key, value]) => console.log(key, value));

for (const [key, value] of Object.entries(user)) {
    console.log(key, value);
}

forEach vs for...of

  • for...of — можно break, continue, await
  • forEach — нельзя прервать
  • for...of быстрее в большинстве случаев

Бесконечные циклы

while (true) {
    // обязательно break внутри
    if (condition) break;
}

Или:

for (;;) {
    if (condition) break;
}

Итоги

  • for — когда нужен счётчик
  • while — когда условие заранее известно
  • for...of — для массивов, строк, коллекций
  • for...in — для ключей объекта
  • forEach — короткая итерация без break
  • break и continue для управления