для чего используется цикл for
Циклы и итерации
Вы можете представить цикл в виде компьютеризированной версии игры, где вы говорите кому-то сделать X шагов в одном направлении, затем Y шагов в другом; для примера, идея игры «Иди 5 шагов на восток» может быть выражена в виде цикла:
Существует множество различных видов циклов, но все они по сути делают тоже самое: повторяют какое-либо действие несколько раз (не забывайте про нулевой раз повторения, отсчёт в массиве начинается с 0). Различные по строению циклы предлагают разные способы для определения начала и окончания цикла. Для различных задач программирования существуют свои операторы цикла, с помощью которых они решаются намного проще.
Операторы предназначенные для организации циклов в JavaScript:
Цикл for
Цикл for повторяет действия, пока не произойдёт какое-либо специальное событие завершения цикла. Оператор for в JavaScript аналогичен оператору for в Java и C. Объявление оператора for выглядит следующим образом:
При его выполнении происходит следующее:
Пример
Цикл do. while
Цикл do. while повторяется пока заданное условие истинно. Оператор do. while имеет вид:
Пример
В следующем примере, цикл do выполнится минимум 1 раз и запускается снова, пока i меньше 5.
Цикл while
Цикл while выполняет выражения пока условие истинно. Выглядит он так:
Если условие становится ложным, выражения в цикле перестают выполняться и управление переходит к выражению после цикла.
Пример 1
Следующий цикл while работает, пока n меньше трёх:
После третьего прохода, условие n становится ложным, поэтому цикл прерывается.
Пример 2
Избегайте бесконечных циклов. Убедитесь, что условие цикла в итоге станет ложным; иначе, цикл никогда не прервётся. Выражения в следующем цикле while будут выполняться вечно, т.к. условие никогда не станет ложным:
Метка (label)
Синтаксис метки следующий:
Значение метки может быть любым корректным JavaScript идентификатором, не являющимся зарезервированным словом. Оператор , указанный вами после метки может быть любым выражением.
Пример
break
Синтаксис оператора может быть таким:
Первая форма синтаксиса прерывает цикл совсем или переключает управление; вторая прерывает специально обозначенное выражение.
Пример 1
Пример 2: Прерывание метки
continue
Синтаксис continue может выглядеть так:
Пример 1
Пример 2
for. in
Оператор for. in проходит по всем перечислимым свойствам объекта. JavaScript выполнит указанные выражения для каждого отдельного свойства. Цикл for. in выглядит так:
Пример
Следующая функция берёт своим аргументом объект и его имя. Затем проходит по всем свойствам объекта и возвращает строку, которая содержит имена свойств и их значения.
Пример №2
Также, по ключу можно выводить значение:
Массивы
Пример
for. of
Цикл for
1. Сравнение циклов: for vs while
Цикл while можно использовать во всех случаях, когда команду или группу команд нужно выполнить несколько раз. Но из всех случаев один случай стоит выделить особо.
Вроде бы все работает как надо, но не очень удобно. Перед циклом мы задаем стартовое значение переменной-счетчика, затем в условии проверяем, не достигла ли она уже финального значения. А вот меняем ее обычно в самом конце тела цикла.
Если у цикла while в круглых скобках было только условие, тут еще добавились две команды, разделенные точкой с запятой.
Все на самом деле проще, чем кажется: компилятор превращает цикл for в обычный цикл while таким образом:
Или лучше продемонстрируем на примере: два примера ниже идентичны.
Вариант 1 | Вариант 2 |
---|
команда1 в цикле for выполняется только один раз перед самим циклом (это видно на втором примере)
команда2 выполняется столько же раз, сколько и тело цикла, но будет выполняться каждый раз уже после того, как выполнится все тело цикла
2. Где используется цикл for
Цикл while | Цикл for |
---|
Обратите внимание на последний пример. Там пропущены команды работы со счетчиком цикла. Нет счетчика — нет команд.
Java разрешает не писать в цикле for «команду по инициализации счетчика» и «команду по изменению счетчика». И даже выражение-условие цикла можно не писать.
Назначение и виды циклов
Циклы – это простой способ для многократного выполнения одних и тех же действий (кода).
На языке JavaScript существуют различные виды циклов, которые по сути дела выполняют одно и тоже. Просто одни задачи решаются более просто с помощью одних циклов, а другие – с помощью других.
В JavaScript существуют различные виды циклов, но все они, по сути, делают одно и тоже. Просто с помощью одних циклов более просто решаются одни задачи, с помощью других – иные.
Цикл for
Данный цикл в основном используется когда известно точное количество повторений. Этот цикл ещё называют циклом со счётчиком.
Синтаксис цикла «for»:
Основные части конструкции цикла «for»:
Рассмотрим пример цикла, который выведет в консоль числа от 1 до 8:
Таким образом, пример, приведённый выше, можно записать ещё так:
Необязательные части цикла цикла «for».
В «for» все части цикла являются не обязательными.
Например, можно пропустить выражение инициализации:
В этом случае инициализацию переменной можно вынести за пределы цикла.
Финальное выражение в «for» также является не обязательным. Счётчик цикла в этом случае можно, например, изменять в теле.
В «for» можно вообще опустить 3 выражения (бесконечный цикл):
Кроме этого, в качестве тела цикла «for» можно использовать пустое выражение ( ; ). Это используется, когда вам не нужно выполнять ни одной инструкции.
Пустое выражение в этом случае рекомендуется дополнительно снабжать комментарием:
Пример использования цикла «for» для перебора элементов массива:
Пример, в котором выведем таблицу умножения в консоль. Для реализации этого примера будем использовать вложенные циклы.
Цикл называется вложенным, если он находится в теле другого цикла.
Цикл while
Данный цикл предназначен для многократного выполнения одних и тех же инструкций до тех пор, пока истинно некоторое условие. Цикл «while» в основном используется, когда количество повторений заранее не известно.
Истинность условия проверяется перед каждым выполнением. Если перед первой итерацией условие ложно, то цикл не выполнится ни разу.
Пример, в котором выведем в консоль чётные числа в диапазоне от 1 до 8:
Цикл do. while
Цикл «do. while», также как и цикл «while», выполняет одни и те же инструкции до тех пор, пока указанное условие истинно. Но в отличие от «while» в «do. while» условие проверяется после выполнения инструкций. Поэтому цикл «do. while» в любом случае выполнится не меньше одного раза, даже если условие изначально ложно.
Пример, в котором выведем в консоль сумму чисел, которые будем запрашивать у пользователя с помощью функции prompt :
Цикл for. in
Свойства объекта, которые не относятся к перечисляемым, в цикле не участвуют.
Переберём свойства объекта, созданного с помощью литеральной записи:
Кроме этого, следует отметить, что цикл for. in проходит не только по перечисляемых свойствам этого объекта, но и по наследуемым.
Если вам наследуемые свойства не нужно учитывать, то их можно пропустить:
Использование цикла for. in для перебора массива. В массиве свойствами являются числовые индексы.
Цикл for. in проходит по свойствам в произвольном порядке. Поэтому если при переборе массива для вас важен порядок символов, то данный цикл лучше не использовать.
При использовании цикла for…in стоит обратить внимание на то, что если вы к массиву добавили свои пользовательские свойства, то он по ним тоже пройдётся:
Если вам такой сценарий не нужен, то тогда для перебора массивов лучше использовать обычный цикл for.
Использование цикла for…in для перебора символов в строке:
Инструкции break и continue
Пример, в котором завершим цикл по перебору элементов массива, если его текущий элемент не будет являться числом:
Пример, в котором найдём в слове «программирование» символы «а» и «о», и выведем их позиции в консоль:
Метки для break и continue
Метка представляет собой идентификатором с двоеточием, который необходимо указать перед циклом.
Далее после оператора break или continue необходимо указать эту метку:
В коде с одиночным циклом использование метки не даст никакого результата. Её есть смысл использовать только когда вам нужно выйти сразу из нескольких циклов.
Пример, в котором выйдем сразу из 2 циклов, когда произведение значений переменных-счётчиков даст число большее 10.
Кроме этого, операторы break и continue нельзя использовать в выражениях тернарных операторов.
Цикл for. of (новинка в ES6)
Пример использование цикла for. of для посимвольного перебора строки:
Пример использование цикла for. of для перебора коллекции DOM-элементов:
Пример использование цикла for. of для перебора массива:
Чем цикл for. of отличается от for. in
Первое отличие цикла for. of от for. in заключается в том, что он может применяться только для итерируемым объектов, т.е. объектов, в которых реализован итератор ( Symbol.iterator ). Цикл for. in итератор не использует. Он предназначен для перебора любых объектов.
Второе отличие заключается в том, что цикл for. of перебирает объект так, как это определено в итераторе. Например, в Array итератор реализован так, что цикл for. of пройдёт только по значениям в массиве и не будет включать в перебор другие (не индексные) свойства. Цикл for. in организован по-другому, он перебирает все перечисляемые свойства (имена ключей) объекта, в том числе и наследуемые.
При использовании for. of он переберёт все значения этого массива:
При использовании for. in он переберёт все перечисляемые имена ключей этого объекта:
Чтобы получить значение ключа по его имени можно воспользоваться квадратными скобками:
Самостоятельное создание итератора для объекта
Рассмотрим ещё один пример. В этом примере мы самостоятельно определим как должен итерироваться объект. Для этого создадим объект и определим ему итератор.
Задачи по циклам
2. Найти самую большую цифру в целом числе.
3. Вычислить сумму первой и последней цифр целого числа.
for Оператор (C++)
Синтаксис
for ( init-expression ; cond-expression ; loop-expression )
statement
Примечания
Используйте for инструкцию для создания циклов, которые должны выполняться указанное число раз.
for Инструкция состоит из трех дополнительных частей, как показано в следующей таблице.
элементы цикла for
В следующих примерах показаны различные способы использования for инструкции.
init-expression и loop-expression могут содержать несколько операторов, разделенных запятыми. Пример:
loop-expression можно увеличить или уменьшить, или изменить другими способами.
Хотя три поля for инструкции обычно используются для инициализации, тестирования завершения и увеличения, они не ограничиваются этими применениями. Например, следующий код выводит числа от 0 до 4. В данном случае statement является оператором null:
for циклы и стандарт C++
Стандарт C++ говорит о том, что переменная, объявленная в for цикле, должна выйти из области действия после for завершения цикла. Пример:
По умолчанию в параметре /Zeпеременная, объявленная в цикле, остается в области видимости до for конца охватывающей области цикла.
Можно также использовать различия в области for действия цикла для повторного объявления переменных в /Ze следующим образом:
Такое поведение более точно имитирует стандартное поведение переменной, объявленной в for цикле, что требует, чтобы переменные, объявленные в for цикле, выходят за пределы области действия после завершения цикла. При объявлении переменной в for цикле компилятор внутренне переводит его в локальную переменную в for области видимости цикла. Она повышается, даже если уже существует локальная переменная с таким же именем.
Циклы while и for
При написании скриптов зачастую встаёт задача сделать однотипное действие много раз.
Например, вывести товары из списка один за другим. Или просто перебрать все числа от 1 до 10 и для каждого выполнить одинаковый код.
Для многократного повторения одного участка кода предусмотрены циклы.
Цикл «while»
Цикл while имеет следующий синтаксис:
Код из тела цикла выполняется, пока условие condition истинно.
Одно выполнение тела цикла по-научному называется итерация. Цикл в примере выше совершает три итерации.
Если бы строка i++ отсутствовала в примере выше, то цикл бы повторялся (в теории) вечно. На практике, конечно, браузер не позволит такому случиться, он предоставит пользователю возможность остановить «подвисший» скрипт, а JavaScript на стороне сервера придётся «убить» процесс.
Любое выражение или переменная может быть условием цикла, а не только сравнение: условие while вычисляется и преобразуется в логическое значение.
Если тело цикла состоит лишь из одной инструкции, мы можем опустить фигурные скобки <…>:
Цикл «do…while»
Проверку условия можно разместить под телом цикла, используя специальный синтаксис do..while :
Такая форма синтаксиса оправдана, если вы хотите, чтобы тело цикла выполнилось хотя бы один раз, даже если условие окажется ложным. На практике чаще используется форма с предусловием: while(…) <…>.
Цикл «for»
Давайте разберёмся, что означает каждая часть, на примере. Цикл ниже выполняет alert(i) для i от 0 до (но не включая) 3 :
Рассмотрим конструкцию for подробней:
В целом, алгоритм работы цикла выглядит следующим образом:
То есть, начало выполняется один раз, а затем каждая итерация заключается в проверке условия, после которой выполняется тело и шаг.
Если тема циклов для вас нова, может быть полезным вернуться к примеру выше и воспроизвести его работу на листе бумаги, шаг за шагом.
Вот в точности то, что происходит в нашем случае:
В примере переменная счётчика i была объявлена прямо в цикле. Это так называемое «встроенное» объявление переменной. Такие переменные существуют только внутри цикла.
Вместо объявления новой переменной мы можем использовать уже существующую:
Пропуск частей «for»
Любая часть for может быть пропущена.
Для примера, мы можем пропустить начало если нам ничего не нужно делать перед стартом цикла.
Можно убрать и шаг :
А можно и вообще убрать всё, получив бесконечный цикл:
При этом сами точки с запятой ; обязательно должны присутствовать, иначе будет ошибка синтаксиса.
Прерывание цикла: «break»
Например, следующий код подсчитывает сумму вводимых чисел до тех пор, пока посетитель их вводит, а затем – выдаёт:
Вообще, сочетание «бесконечный цикл + break » – отличная штука для тех ситуаций, когда условие, по которому нужно прерваться, находится не в начале или конце цикла, а посередине.
Переход к следующей итерации: continue
Её используют, если понятно, что на текущем повторе цикла делать больше нечего.
Цикл, который обрабатывает только нечётные значения, мог бы выглядеть так:
Например, если мы возьмём этот код:
…и перепишем его, используя вопросительный знак:
…то будет синтаксическая ошибка.
Метки для break/continue
Бывает, нужно выйти одновременно из нескольких уровней цикла сразу.
Нам нужен способ остановить выполнение если пользователь отменит ввод.
Обычный break после input лишь прервёт внутренний цикл, но этого недостаточно. Достичь желаемого поведения можно с помощью меток.
Метка имеет вид идентификатора с двоеточием перед циклом:
Вызов break в цикле ниже ищет ближайший внешний цикл с такой меткой и переходит в его конец.
Можно размещать метку на отдельной строке:
Директива continue также может быть использована с меткой. В этом случае управление перейдёт на следующую итерацию цикла с меткой.
Метки не дают возможности передавать управление в произвольное место кода.
Например, нет возможности сделать следующее:
Вызов break/continue возможен только внутри цикла, и метка должна находиться где-то выше этой директивы.
Итого
Мы рассмотрели 3 вида циклов:
Обе этих директивы поддерживают метки, которые ставятся перед циклом. Метки – единственный способ для break/continue выйти за пределы текущего цикла, повлиять на выполнение внешнего.
Заметим, что метки не позволяют прыгнуть в произвольное место кода, в JavaScript нет такой возможности.