При написании скриптов зачастую встает задача сделать однотипное действие много раз.
Например, вывести товары из списка один за другим. Или просто перебрать все числа от 1 до 10 и для каждого выполнить одинаковый код.
Для многократного повторения одного участка кода - предусмотрены циклы.
Цикл while
Цикл while имеет вид:
while(условие) {
// код, тело цикла
}
Пока условие верно — выполняется тело цикла
Например, цикл ниже выводит i пока i < 3:
var i = 0;
while (i < 3) {
alert(i);
i++;
}
Повторение цикла по-научному называется «итерация». Цикл в примере выше совершает три итерации.
Если бы i++ в коде выше не было, то цикл выполнялся бы (в теории) вечно. На практике, браузер выведет сообщение о «зависшем» скрипте и посетитель его остановит.
Бесконечный цикл можно сделать и проще:
while(true) {
// ...
}
Цикл do..while
Проверку условия можно поставить под телом цикла, используя специальный синтаксис do..while:
do {
// тело цикла
} while(условие);
Цикл, описанный, таким образом, сначала выполняет тело, а затем проверяет условие.
Например:
var i = 0;
do {
alert(i);
i++;
} while( i < 3);
Синтаксис do..while редко используется, т.к. обычный while нагляднее — в нём не приходится искать глазами условие и ломать голову, почему оно проверяется именно в конце.
Какое последнее значение выведет этот код? Почему?
var i = 3;
while(i) {
alert(i--);
}
Ответ: 1.
var i = 3;
while(i) {
alert(i--);
}
Каждое выполнение цикла уменьшает i. Проверка while(i) даст сигнал «стоп» при i = 0.
Соответственно, шаги цикла:
var i = 3 alert(i--); // выведет 3, затем уменьшит i до 2 alert(i--) // выведет 2, затем уменьшит i до 1 alert(i--) // выведет 1, затем уменьшит i до 0 // все, проверка while(i) не даст выполняться циклу дальше
Цикл for
Чаще всего применяется цикл for. Выглядит он так:
for (начало; условие; шаг) {
// ... тело цикла ...
}
Например, цикл выводит значения от 0 до 3 (не включая 3):
var i;
for (i=0; i<3; i++) {
alert(i);
}
- Начало
i=0выполняется при заходе в цикл. - Условие
i<3проверяется перед каждой итерацией. - Шаг
i++выполняется после каждой итерации, но перед проверкой условия.
В цикле также можно определить переменную:
for (*!*var*/!* i=0; i<3; i++) {
...
}
Любая часть for может быть пропущена.
Например, можно убрать начало:
var i = 0; for (; i<3; i++) ...
Можно убрать и шаг:
var i = 0;
for (; i<3; ) {
// цикл превратился в аналог while(i<3)
}
А можно и вообще убрать все, получив бесконечный цикл:
for (;;) {
// будет выполняться вечно
}
При этом сами точки с запятой ; обязательно должны присутствовать, иначе будет ошибка синтаксиса.
Существует также специальная конструкция for..in для перебора свойств объекта. Мы познакомимся с ней позже, когда будем говорить об объектах.
Для каждого цикла запишите, какие значения он выведет. Потом сравните с ответом.
var i = 0; while (++i < 5) alert(i);
var i = 0; while (i++ < 5) alert(i);
- От 1 до 4
var i = 0; while (++i < 5) alert(i);
Первое значение -i=1, так как первым выполнится сравнение++i < 5. При этомiбудет уже увеличена до1.Далее
2,3,4..Значения выводятся одно за другим. Для каждого значения сначала происходит увеличение, а потом — сравнение, так как++стоит перед переменной.При
i=4произойдет увеличениеiдо5, а потом сравнениеwhile(5 < 5)— неверно. Поэтому на этом цикл остановится, и значение5выведено не будет. - От 1 до 5
var i = 0; while (i++ < 5) alert(i);
Первое значение -i=1, по той же причине.Далее
2,3,4..Для каждого значения сначала происходит сравнение, а потом — увеличение, так как++стоит после переменной.При
i=4произойдет сравнениеwhile(4 < 5)— верно, после этого сработаетi++, увеличивiдо5, так что значение5будет выведено.
Для каждого цикла запишите, какие значения он выведет. Потом сравните с ответом.
for(var i=0; i<5; i++) alert(i);
for(var i=0; i<5; ++i) alert(i);
От 0 до 4 в обоих случаях
for(var i=0; i<5; ++i) alert(i); for(var i=0; i<5; i++) alert(i);
Такой результат обусловлен алгоритмом работы for:
- Выполнить присвоение
i=0 - Проверить
i<5 - Если верно - выполнить тело цикла
alert(i), затем выполнитьi++
Увеличение i++ выполняется отдельно от проверки условия (2), значение i при этом не используется, поэтому нет никакой разницы между i++ и ++i.
Посмотрите страницу tutorial/intro/source/loop.html.
Перепишите код, заменив цикл for на while, без изменения поведения цикла.
Напишите цикл, который предлагает prompt ввести число, большее 100. Если посетитель ввел другое число — попросить ввести еще раз, и так далее.
Цикл должен спрашивать число пока либо посетитель не введет число, большее 100, либо не нажмет кнопку Cancel (ESC).
Демо.
Решение: tutorial/intro/endless_loop.html
Комментарии
- Приветствуются комментарии, содержащие дополнения и вопросы по статье, и ответы на них.
- Если ваш комментарий касается задачи -- откройте её в отдельном окне и напишите там.
- Комментарии без смысла, с рекламой или не о статье вообще - удаляются.