Чаще всего применяется цикл for. Выглядит он так:
for (начало; условие; шаг) {
}
Пример цикла, который выполняет alert(i) для i от 0 до 2 включительно (до 3):
var i;
for (i = 0; i < 3; i++) {
alert( i );
}
Здесь:
- Начало:
i=0.
- Условие:
i<3.
- Шаг:
i++.
- Тело:
alert(i), т.е. код внутри фигурных скобок (они не обязательны, если только одна операция)
Цикл выполняется так:
- Начало:
i=0 выполняется один-единственный раз, при заходе в цикл.
- Условие:
i<3 проверяется перед каждой итерацией и при входе в цикл, если оно нарушено, то происходит выход.
- Тело:
alert(i).
- Шаг:
i++ выполняется после тела на каждой итерации, но перед проверкой условия.
- Идти на шаг 2.
Иными словами, поток выполнения: начало → (если условие → тело → шаг) → (если условие → тело → шаг) → … и так далее, пока верно условие.
Любая часть for может быть пропущена.
Например, можно убрать начало. Цикл в примере ниже полностью идентичен приведённому выше:
var i = 0;
for (; i < 3; i++) {
alert( i );
}
Можно убрать и шаг:
var i = 0;
for (; i < 3;) {
alert( i );
}
А можно и вообще убрать всё, получив бесконечный цикл:
При этом сами точки с запятой ; обязательно должны присутствовать, иначе будет ошибка синтаксиса.
Выйти из цикла можно не только при проверке условия но и, вообще, в любой момент. Эту возможность обеспечивает директива break.
Например, следующий код подсчитывает сумму вводимых чисел до тех пор, пока посетитель их вводит, а затем – выдаёт:
var sum = 0;
while (true) {
var value = +prompt("Введите число", '');
if (!value) break;
sum += value;
}
alert( 'Сумма: ' + sum );
Директива break в строке (*), если посетитель ничего не ввёл, полностью прекращает выполнение цикла и передаёт управление на строку за его телом, то есть на alert.
Вообще, сочетание «бесконечный цикл + break» – отличная штука для тех ситуаций, когда условие, по которому нужно прерваться, находится не в начале-конце цикла, а посередине.
Директива continue прекращает выполнение текущей итерации цикла.
Она – в некотором роде «младшая сестра» директивы break: прерывает не весь цикл, а только текущее выполнение его тела, как будто оно закончилось.
Её используют, если понятно, что на текущем повторе цикла делать больше нечего.
Например, цикл ниже использует continue, чтобы не выводить чётные значения:
for (var i = 0; i < 10; i++) {
if (i % 2 == 0) continue;
alert(i);
}
Для чётных i срабатывает continue, выполнение тела прекращается и управление передаётся на следующий проход for.
Цикл, который обрабатывает только нечётные значения, мог бы выглядеть так:
for (var i = 0; i < 10; i++) {
if (i % 2) {
alert( i );
}
}
С технической точки зрения он полностью идентичен. Действительно, вместо continue можно просто завернуть действия в блок if. Однако, мы получили дополнительный уровень вложенности фигурных скобок. Если код внутри ifболее длинный, то это ухудшает читаемость, в отличие от варианта с continue.
For...in / For...of