Что это такое и когда их использовать
Цикл сообщает вашей программе, что нужно многократно выполнять определенное действие. Количество раз, которое ваша программа должна выполнить это действие, зависит от установленных вами условий.
Говоря непрограммируемым языком, скажем, вы указываете другу, как добраться до вашего дома. Они звонят вам и говорят, что они на вашей улице, но не знают, какой дом ваш. Вы говорите им: «Продолжайте идти на север, пока не дойдете до желтого дома на углу». В этом утверждении «пока вы не дойдете до желтого дома на углу» - вот условие, которое вы поставили для своего друга. Они будут продолжать идти на север , пока не дойдут до этого дома, после чего они остановятся.
Что бы произошло, если бы вы не дали своему другу это заболевание? Другими словами, что произойдет, если вы просто скажете своему другу: «Иди на север»? Ваш друг никогда не узнает, когда остановиться. Они будут продолжать идти на север мимо вашего дома. Вы не можете обвинять друга в том, что он не нашел ваш дом, поскольку вы никогда не говорили ему, когда остановиться.
Этот пример, не связанный с программированием, иллюстрирует одну из наиболее распространенных проблем, с которыми люди сталкиваются при работе с циклами: бесконечный цикл. Если вы не укажете циклу, когда остановиться, цикл будет продолжаться вечно. Важно отметить, что если вы сообщаете своему циклу, когда остановиться, но эта точка остановки никогда не может быть достигнута, это также бесконечный цикл. Используя тот же пример, допустим, вы сказали своему другу: «Продолжайте идти на север, пока не дойдете до розового дома на углу». Ваш друг продолжает идти на север, но, как бы далеко он ни прошел, он никогда не находит розовый дом на углу. Даже если вы указали своему другу конечную точку, они никогда не смогут достичь этой конечной точки, поэтому они (теоретически) будут продолжать идти вечно.
При работе с циклами очень важно указать, когда цикл должен прекратиться и что конечная точка действительно может быть достигнута.
1. Пока петли
Один из самых популярных циклов - цикл while. Цикл while
имеет следующую структуру:
while (condition) { statement }
Перед выполнением оператора проверяется condition
. Если он оценивается как true
, то инструкция выполняется. Пока condition
равно true
, инструкция продолжает выполняться. Когда condition
становится false
, инструкция прекращает выполнение.
Например, предположим, что у вас есть переменная с именем e
, которая начинается с 0
. Вы хотите, чтобы e
продолжал увеличиваться (или увеличиваться на 1), пока e
меньше 4
.
let e = 0; while (e < 4) { e++; }
Вот таблица, в которой показано, что происходит в приведенном выше цикле:
Пока e < 4
равно true
, цикл выполняется. Когда он становится false
, он не выполняется.
При работе с циклами while очень легко случайно написать бесконечный цикл. Например, если условие из приведенного выше примера было e >= 0
, цикл будет выполняться бесконечно. e
начинается с 0
, что означает true
, и продолжает увеличиваться, что означает, что условие всегда будет оцениваться как true
:
//Infinite loop let e = 0; while (e >= 0) { e++; }
2. Для петель
Еще один широко используемый цикл - это цикл for. Цикл for
имеет следующую структуру:
for (initialExpression; conditionExpression; incrementExpression) { statement }
initialExpression
- это первое, что запускается. Любая переменная, созданная в этом выражении, привязана к циклу (это означает, что вы не можете ссылаться на эту переменную извне цикла). initialExpression
обычно используется для инициализации счетчика.
Затем conditionExpression
оценивается как true
или false
. Если это true
, то инструкция выполняется. Если это false
, оператор не выполняется, а цикл for
завершается. Если conditionExpression
не указан, автоматически устанавливается условие true
.
incrementExpression
запускается после выполнения оператора. Так же, как initialExpression
обычно инициализирует счетчик в for
цикле, incrementExpression
обычно увеличивает этот счетчик. Однако выражение также может уменьшить счетчик (или уменьшить на 1). На этом этапе conditionExpression
снова оценивается, и если он по-прежнему true
, цикл for
продолжает выполняться.
Например, давайте создадим for
цикл, который записывает в консоль фразу «Я могу считать до X», где X
- это число, начинающееся с 1
и идущее до 5
. Начнем с инициализации переменной в initialExpression
с помощью let i = 1
. Затем мы устанавливаем conditionExpression
на i <= 5
. Это означает, что оператор будет продолжать выполняться, пока i
меньше или равно 5
. Наконец, мы хотим увеличивать i
на 1 каждый раз при выполнении цикла, поэтому incrementExpression
равно i++
. Примечание. Важно, чтобы каждое выражение разделялось точкой с запятой, ;
.
for (let i = 1; i <= 5; i++) { console.log(“I can count to “ + i) }
Вот таблица, в которой показано, что происходит в приведенном выше цикле:
Бесконечные циклы также случаются с for
циклами. Одним из примеров бесконечного цикла может быть использование того же примера, приведенного выше, но изменение третьего выражения на i — -
. i — -
означает, что i
продолжает уменьшаться, поэтому i
начнется с 1
, затем станет 0
, затем -1
и так далее. Все это время i <=5
будет продолжать вычислять значение true
, потому что i
всегда будет меньше или равно 5
.
//Infinite loop for (let i = 1; i <= 5; i — ) { console.log(“I can count to “ + i) }
3. Выполните… циклы while.
Цикл do… while очень похож на цикл while
. Цикл do...while
имеет следующую структуру:
do { statement } while (condition);
Первое, что происходит в этом цикле, - это выполнение оператора. Как только это произойдет, проверяется condition
. Если condition
оценивается как true
, оператор выполняется снова. Оператор будет выполняться до тех пор, пока condition
не станет false
. Основное различие между циклом do...while
и циклом while
заключается в том, что оператор всегда будет выполняться хотя бы один раз.
Например, давайте инициализируем переменную с именем booksRead
равной 10
. Мы хотим записать в консоль Я прочитал X книг в этом году, где X
- это значение booksRead
. Затем мы установим условие booksRead < 14
. Примечание. в приведенном ниже примере я использую интерполяцию строк, когда консоль регистрирует количество книг, прочитанных в этом году. Строковая интерполяция выполняется с помощью шаблонных литералов в JavaScript.
let booksRead = 10; do { console.log(`I read ${booksRead} books this year`); booksRead++; } while (booksRead < 14);
Вот таблица, в которой показано, что происходит в приведенном выше цикле:
Один из способов создания бесконечного цикла при работе с do…while
циклами - это не увеличивать переменную, которую вы проверяете в условии. Используя тот же пример, что и выше, если вы никогда не увеличиваете booksRead
, тогда booksRead
останется на 10
навсегда, что означает, что условие booksRead < 14
всегда будет true
.
//Infinite loop let booksRead = 10; do { console.log(`I read ${booksRead} books this year`); } while (booksRead < 14);
4. For… in петли
Цикл for… in используется с объектом в JavaScript. Он имеет следующую структуру:
for (variable in object) { statement }
Цикл for…in
выполняет итерацию переменной по каждому свойству (или ключу) объекта. Для каждого свойства выполняется инструкция. Цикл позволяет вам получить доступ к каждому свойству объекта, не зная имени свойства. Циклы `for… in` перебирают свойства объекта в произвольном порядке. Следовательно, согласно документации MDN, лучше не добавлять, не изменять и не удалять свойства объекта во время итерации, кроме свойства, которое в данный момент посещается. Вы также должны не использовать for… in в циклах с массивами.
Например, предположим, что у вас есть объект, в котором перечислены все приемы пищи, которые вы ели в тот день, и вы хотите, чтобы консоль регистрировала все, что вы ели. Объект называется foodIAte
. Используя цикл for…in
, вы можете перечислить название каждого приема пищи, а также то, что вы ели для этого приема пищи.
const foodIAte = { breakfast: ‘eggs’, lunch: ‘salad’, dinner: ‘pizza’ }; for(const meal in foodIAte) { console.log(`For ${meal}, I ate ${foodIAte[meal]}.`); };
Вот таблица, в которой показано, что происходит в приведенном выше цикле:
5. Для… петель
Последний цикл - это цикл for… of. Цикл for…of
можно использовать с итерируемыми объектами, которые включают массивы, карты, наборы, строки, и многое другое. Он имеет следующую структуру:
for (variable of iterableObject) { statement }
Цикл for…of
повторяется по iterableObject
, и оператор выполняется для значения каждого свойства в iterableObject
. В то время как for…in
циклы перебирают свойство name, for…of
циклы перебирают свойство value.
Например, предположим, что у вас есть массив, и вы хотите, чтобы в консоль регистрировалось каждое значение массива:
const array = [5, 10, 15]; for (const value of array) { console.log(value); }
Вышеупомянутый цикл будет консольным журналом 5
, 10
, 15
.
Допустим, у вас есть строка, и вы хотите, чтобы в консоль регистрировалось каждое значение строки:
const string = “cat”; for (const value of string) { console.log(value); }
Вышеупомянутый цикл будет консольным журналом c
, a
, t
.
Вот видео от Sunil Sandhu, которое также охватывает каждую из этих 5 петель с примерами:
Пожалуйста, дайте мне знать в комментариях, если у вас есть какие-либо вопросы или другие мысли о циклах в JavaScript.
Ресурсы
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Loops_and_iteration
- https: // developer. mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/ Ссылка / Заявления / для ... в
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
- https: // www.w3schools.com/js/js_loop_for.asp
- https://www.freecodecamp.org/news/javascript-loops-explained-for-loop-for/
- https : //www.javascripttutorial.net/javascript-for-in/