Циклы for
Много циклов строятся по такому шаблону, как в примере. Создаётся переменная-счётчик, потом идёт цикл while
, где проверочное выражение обычно проверяет, не достигли ли мы какой-нибудь границы. В конце тела цикла счётчик обновляется.
Поскольку это такой частый случай, в JavaScript есть вариант покороче, цикл for
.
for (var number = 0; number <= 12; number = number + 2)
console.log(number);
// → 0
// → 2
// … и т.д.
Эта программа эквивалентна предыдущей. Только теперь все инструкции, относящиеся к отслеживанию состояния цикла, сгруппированы.
Скобки после for
содержат две точки с запятой, разделяя инструкцию на три части. Первая инициализирует цикл, обычно задавая начальное значение переменной. Вторая – выражение проверки необходимости продолжения цикла. Третья – обновляет состояние после каждого прохода. В большинстве случаев такая запись более короткая и понятная, чем while
.
Вычисляем 210 при помощи for
:
var result = 1;
for (var counter = 0; counter < 10; counter = counter + 1)
result = result * 2;
console.log(result);
// → 1024
Хотя я не писал фигурных скобок, я отделяю тело цикла пробелами.
Выход из цикла
Дождаться, пока условие цикла не станет ложным – не единственный способ закончить цикл. Специальная инструкция break
приводит к немедленному выходу из цикла.
В следующем примере мы покидаем цикл, когда находим число, большее 20 и делящееся на 7 без остатка.
for (var current = 20; ; current++) {
if (current % 7 == 0)
break;
}
console.log(current);
// → 21
Конструкция for
не имеет проверочной части – поэтому цикл не остановится, пока не сработает инструкция break
.
Если вы не укажете эту инструкцию, или случайно напишете условие, которое всегда выполняется, программа зависнет в бесконечном цикле и никогда не закончит работу – обычно это плохо.
Если вы сделаете бесконечный цикл, обычно через несколько секунд среда исполнения предложит вам прервать его. Если нет, вам придётся закрыть закладку, или даже весь браузер.
Ключевое слово continue
также влияет на исполнение цикла. Когда это слово встречается в цикле, он немедленно переходит на следующую итерацию.
Короткое обновление переменных
Особенно часто в циклах программе нужно обновить переменную, основываясь на её предыдущем состоянии.
counter = counter + 1;
В JavaScript есть для этого короткая запись:
counter += 1;
Подобные записи работают для многих других операторов, к примеру result *= 2
для удвоения, или counter -= 1
для обратного отсчёта.
Это позволяет нам сократить программу вывода чётных чисел:
for (var number = 0; number <= 12; number += 2)
console.log(number);
Для counter += 1
и counter -= 1
есть ещё более короткие записи: counter++
и counter--
.
Работаем с переменными при помощи switch
Часто код выглядит так:
if (variable == "value1") action1();
else if (variable == "value2") action2();
else if (variable == "value3") action3();
else defaultAction();
Существует конструкция под названием switch
, которая упрощает подобную запись. К сожалению, синтаксис JavaScript (заимствованный из языков C и Java)в этом случае довольно странный – часто цепочка if
/else
выглядит лучше. Пример:
switch (prompt("Как погодка?")) {
case "дождь":
console.log("Не забудь зонт.");
break;
case "снег":
console.log("Блин, мы в России!");
break;
case "солнечно":
console.log("Оденься полегче.");
case "облачно":
console.log("Иди гуляй.");
break;
default:
console.log("Непонятная погода!");
break;
}
В блок switch
можно поместить любое количество меток case
. Программа перепрыгивает на метку, соответствующую значению переменной в switch
, или на метку default
, если подходящих меток не найдено. После этого инструкции исполняются до первой инструкции break
– даже если мы уже прошли другую метку. Иногда это можно использовать для исполнения одного и того же кода в разных случаях (в обоих случаях «солнечно» и «облачно» программа порекомендует пойти погулять). Однако, очень легко забыть запись break
, что приведёт к выполнению нежелательного участка кода.