Мастер-классы по Javascript Екатеринбург Ростов-на-Дону Москва Узнать больше...
Содержание (скрыть) Содержание (показать)

Циклы while, for

  1. Цикл while
  2. Цикл do..while
  3. Цикл for

При написании скриптов зачастую встает задача сделать однотипное действие много раз.

Например, вывести товары из списка один за другим. Или просто перебрать все числа от 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

Существует также специальная конструкция for..in для перебора свойств объекта. Мы познакомимся с ней позже, когда будем говорить об объектах.

Для каждого цикла запишите, какие значения он выведет. Потом сравните с ответом.

  1. var i = 0;
    while (++i < 5) alert(i);
    
  2. var i = 0;
    while (i++ < 5) alert(i);
    
Решение
Решение
  1. От 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 выведено не будет.

  2. От 1 до 5
    var i = 0;
    while (i++ < 5) alert(i);
    
    Первое значение - i=1, по той же причине.

    Далее 2,3,4.. Для каждого значения сначала происходит сравнение, а потом — увеличение, так как ++ стоит после переменной.

    При i=4 произойдет сравнение while(4 < 5) — верно, после этого сработает i++, увеличив i до 5, так что значение 5 будет выведено.

Для каждого цикла запишите, какие значения он выведет. Потом сравните с ответом.

  1. for(var i=0; i<5; i++) alert(i);
    
  2. 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:

  1. Выполнить присвоение i=0
  2. Проверить i<5
  3. Если верно - выполнить тело цикла alert(i), затем выполнить i++

Увеличение i++ выполняется отдельно от проверки условия (2), значение i при этом не используется, поэтому нет никакой разницы между i++ и ++i.

Посмотрите страницу tutorial/intro/source/loop.html.

Перепишите код, заменив цикл for на while, без изменения поведения цикла.

Решение
Решение

tutorial/intro/loop.html.

Напишите цикл, который предлагает prompt ввести число, большее 100. Если посетитель ввел другое число — попросить ввести еще раз, и так далее.

Цикл должен спрашивать число пока либо посетитель не введет число, большее 100, либо не нажмет кнопку Cancel (ESC).

Демо.

Решение
Решение

Решение: tutorial/intro/endless_loop.html


Комментарии

  1. Приветствуются комментарии, содержащие дополнения и вопросы по статье, и ответы на них.
  2. Если ваш комментарий касается задачи -- откройте её в отдельном окне и напишите там.
  3. Комментарии без смысла, с рекламой или не о статье вообще - удаляются.
Наверх

Содержание

Реклама

Нашли опечатку?

Нашли опечатку на сайте? Что-то кажется странным?
Выделите соответствующий текст и нажмите Ctrl+Enter!

Последние Комментарии

Помоги другим!

Помоги другим узнать о хорошей статье!