Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебник в JavaScript.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
2.82 Mб
Скачать

Циклы 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) {

  // ...

}

Условие в скобках интерпретируется как логическое значение, поэтому вместо while (i!=0) обычно пишут while (i):

   

var i = 3;

while (i) { // при i=0 значение в скобках будет false и цикл остановится

  alert(i);

  i--;

}

Цикл do..While

Проверку условия можно поставить под телом цикла, используя специальный синтаксис do..while:

do {

  // тело цикла

} while (условие);

Цикл, описанный, таким образом, сначала выполняет тело, а затем проверяет условие.

Например:

   

var i = 0;

do {

  alert(i);

  i++;

} while (i < 3);

Синтаксис do..while редко используется, т.к. обычный while нагляднее — в нём не приходится искать глазами условие и ломать голову, почему оно проверяется именно в конце.

Важность: 3

Какое последнее значение выведет этот код? Почему?

var i = 3;

 

while(i) {

  alert(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 для перебора свойств объекта.

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

Важность: 4

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

  1. Префиксный вариант

    var i = 0;

    while (++i < 5) alert(i);

  2. Постфиксный вариант

var i = 0;

while (i++ < 5) alert(i);

Решение

[Открыть задачу в новом окне]

Важность: 4

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

  1. Постфиксная форма:

    for(var i=0; i<5; i++) alert(i);

  2. Префиксная форма:

for(var i=0; i<5; ++i) alert(i);

Решение

[Открыть задачу в новом окне]

Важность: 1

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

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

Решение

[Открыть задачу в новом окне]

Важность: 5

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

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

Предполагается, что посетитель вводит только числа.

Пример работы.

Решение

[Открыть задачу в новом окне]

‹ Логические операторы Директивы break и continue ›

01.11.2010

Илья Кантор

Александр

var answ = 1; while ( (answ = prompt('Введите число больше 100', 100)) <= 100 && answ ) {}

Катерина Червенкова

Я попробовала все возможные варианты решения задачи:

var i = 0; while (i < 3) {   alert(i++); }

http://learn.javascript.ru/pla...

Обнаружилось, что - первые два аналогичны по результату (потому что постфиксная форма возвращает сначала старое значение, потом новое), причём вариант с i++ короче; - а вторые два различаются: первый выводит сразу новое значение (что закономерно), и даже одно выходящее за границы условия (3), поэтому такая форма записи для решения не подходит; а второй выводит сперва старое, потом новое, то есть в принципе аналогичен первым двум. Итого: оптимален самый первый вариант.

Влад

         <script type="text/javascript">       var i = 0;       while (i < 3) {         alert("number " + i + "!");         i++       }     </script>  

Nikamir

for(i=0; i<100 && i!=null;){i = prompt('Number?','')}

almariel2

Я, конечно, не так сделала, но почему-то результат условиям соответствует

  var numb = prompt ('Введите число больше 100', '');    while (numb < 100 ) {  var numb = prompt ('Введите число больше 100', ''); }

Александр Белец

нет проверки на null, плюс, дважды одна команда повторяется, чего можно было бы избежать в do...while. Речь идет о красоте кода, однако, на нее полезно ориентироваться, полагаю, для  систем с высокой нагрузкой.

GrafMonteKristo

  • Вдоволь постебавшись над циклом for, я понял, что это некий гибрид управляющей конструкции, блока, задающего переменные и трёх (!!) вспомогательных блоков с действиями. Посмотрите на скрипт - повеселитесь от души! =)

Александр Белец

интересно, сколько будет итераций у цикла for(i++;i++<10;i++){console.log(i);}

GrafMonteKristo

Ты читать умеешь или нет?  Я же русским языком написал "любое присвоение КРОМЕ любой формы -крементов".

Александр Белец

Эй, полегче, я тебе не брат или сестра, чтобы так фамильярничать. Уберем из первого блока инкремент, хорошо. Каков ответ на такой вопрос? Сколько будет в итоге итераций, каков будет их порядок? Интереса это почти не снижает.

Го

От 1 до 5.

var i = 0;while (i++ < 5) alert(i);

Первое значение: i=1. Остановимся на нём подробнее. Оператор i++увеличивает i, возвращая старое значение, так что в сравнении i++ < 5 будет участвовать старое i=0.А почему 0 не выведет?

Artur Trvd

var i = 0;while (i++ < 5) alert(i); при сравнении:  (i++ < 5) сначала сравнивает 0 < 5 потом увеличивает но на 1, а когда идёт в тело цикла в i уже значение 1 вот он и выводит 1 

Artur Trvd

потом увеличивает ноль на 1*

сори клавиши на клаве западают)

Mel1

А можно так про 100 написать? 

var num=0; while (num != null && num=prompt('Введите число больше 100',0) <= 100 ) ; 

ПавелСурж

Я решил задачу про больше ста так: <title></title><meta charset="utf-8"><script>var a = 1;while (a <= 100) {a = prompt('Введите число большее 100.','');}</script>

David

Да, не помешало бы итога в конце главы и заданий по всему что было в этой главе! тогда все хорошо закрепится и запомнится)

Baizer

1var i = 3;2 3while(i) {4  alert(i--);5} РешениеОтвет: 3,2,1.А не  1.

Андрей Гладков

Я только начал изучать язык по данному ресурсу. Последнюю задачу решил так:

 for (var i=0; i<100&& i!=null; i =prompt('enter the namber > 100','')) {}Спасибо за замечательный ресурс:)! 

palehorse

Очень кривое решение, которое, во-первых, противоречит самой природе цикла for (for использует переменную-счетчик, которая в пределах цикла должна использоваться лишь для подсчета количества итераций, а не для сохранения значений каких-либо выражений), во-вторых, затрудняет читаемость кода, в-третьих, работает некорректно (попробуйте, используя этот код, ввести не число). Циклы while и do-while существуют не для красоты, пользуйтесь ими, это как раз подходящий случай. Учитесь с самого начала решать задачи правильно во всех смыслах.

palehorse

Прошу прощения насчет третьего пункта, не дочитал условие задачи до конца :)

Андрей Гладков

Тогда как я понимаю должно быть в током виде:

for (var i=0; i<100&& i!=null; ) {      i =prompt('enter the namber > 100','')                                            }Спасибо за обратную связь.

Андрей Гладков

Прочитал еще раз:) вот так вот поторопился...  и понял что речь шла и об имени переменной тоже.. т.е такой вид можно считать корректным :  for (var num = 0; num<100&& num!=null; ) {        num =prompt('Введите число больше 100','')                                                                }

Андрей Гладков

Вот опять прочитал и из ваших слов, вижу что цикл For только считает количество итераций а не для сохранения значения.. Но значение полученное в результате выполнения  цикла for можно вывести.. ( в теории? или я ошибаюсь?).Что то я окончательно запутался..

Для изучения пользуюсь только этим ресурсом..

Dimitry Lapynow

Отличная глава, спасибо!

Скучаю по итогам в конце главы, как было в некоторых ранее, что бы укомплектовать информацию и закрепить материал.

Volya Pers

Почему етот код не работает?о_О do {          var numbr=promt("Введите число больше 100 и всё будет нормас","");        }      while(numbr<=100 && numbr!=null);

ATi

 Потому что promt is not definedОчепятка))

Volya Pers

Почему етот код не работает?о_О

do {          var numbr=promt("Введите число больше 100 и всё будет нормас","");        }      while(numbr<=100 && numbr!=null);

Сергей

У меня работает такой код: <script> do {  var num=prompt('Введите число, большее 100','');  if (num<=100&& num!=null) {  alert ('Вы ввели число, меньше 100. Попробуйте еще раз )');  } } while (num<=100 && num!=null); alert ('Введенное Вами число - '+num);</script> Только как сделать, чтобы откидывало все символы кроме цифр?

Dennis

Последняя задача – просто потрясающая (по крайне мере – для чайника, вроде меня).Во-первых, хочу сказать, что фраза в последнем предложении решения задачи «при вводе null» создает впечатление, что имеется ввиду введение строки « null» в промпт. Может написать «при возращении промптом значения null»…Во-вторых, данная задача отлична помогла еще раз уяснить, что такое специальное значение null и в чем различия работы логических операторов ИЛИ и И.И в-третьих, я не совсем понял алгоритм сброса цикла при введении строки. Получается, что при введении строки сравнение num <= 100 дает false, но почему именно? Не может же быть, что любая буква больше цифры сто, или может?

Dennis

Методом проверки всех вариантов сравнения разобрался, почему строка дает False и обрыв цикла: во всех сравнениях с цифрой строка дает False, кроме сравнения “НЕ равно”.

Также прочитал еще раз раздел «операторы сравнения» и понял почему Null дает True в данном сравнении (так как Null приводится к нулю).

А вот с пустой  строкой, вернувшейся из промпта – не понятно.

Если пустую строку, вернувшуюся из промпта, сравнить (пустая строка<1) то будет True, поэтому цикл повторяется. Но ведь должно вернутся Ubdefined, которое как сказано в разделе «операторы сравнения» «При преобразовании в число  undefined становится NaN … А значение NaN по стандарту устроено так, что любые сравнения с ним возвращают false». Непонятно…

PS Сравнивал Ubdefined, полученную в такой ситуации: var num;  alert(num<1); и, да, дает False, как и положено…

Dimitry Lapynow

Функция prompt возвращает тип String, а при сравнении строки с числом выдается значение false. И если вписать любое символьное значение(включая 'null'), то получим false и прерывание цикла.

Пустая же строка приравнивается к 0, что подходит по условию цикла, поэтому прерывания не вызывает.

Fenix-2750

var num=prompt('Введите число, большее 100', '0'); do {   var num = prompt("Введите число больше 100?", 0); } while(num <= 100 && num != null); alert('Верно!');

Это скрипт, данный в решении. Если два раза нажать на "Отмена", цикл прекращается и выводит "Верно!". А если сделать проще, например, вот так:

var num=prompt('Введите число, большее 100', '0');while(num<=100) {  var num = prompt("Введите число больше 100?", 0);} while(num <= 100 && num != null);alert('Верно!');

или так:

var num=prompt('Введите число, большее 100', '0');for(; num<=100; ) {  var num = prompt("Введите число больше 100?", 0);} while(num <= 100 && num != null);alert('Верно!');то будет работать до тех пор, пока не введете число, большее 100.

Vir2alex

Объявлять одну и ту же переменную много раз, это хорошо?

Patch

особого смысла в этом нет, да и считается плохим тоном.

Ag-velichko

последняя задача еще проще: var i=prompt('Введите число','');for(;i<=100&&i!=null; ){i=prompt('Введите число','');}

shamash

Тогда уж и var внутрь for: for(var i=prompt('Введите число','');i<=100&&i!=null; ){i=prompt('Введите число','');}

Verasiavka

Меня интересует тот же вопрос, что и Катюшу Гриценко

Во второй части задания "Для каждого цикла запишите, какие значения он выведет. Потом сравните с ответом." (в решении) указано объяснение, почему первое значение i=1 вот так:

"Первое значение - i=1, по той же причине."

Тоесть, исходя из объяснений по первому циклу, причина вот такая:"Первое значение - i=1, так как первым выполнится сравнение ++i < 5. При этом i будет уже увеличена до 1." (т.е.1<5)зы. СНАЧАЛА увеличение i на 1, ПОТОМ сравнение этого увеличенного i=1 и 5.

Но, если я все правильно поняла, то это объяснение не подходит для второго цикла. Оно должно быть примерно таким:"Первое значение - i=1, так как первым выполнится сравнение i++ < 5. При этом i будет равно 0, т.е. 0<5 - условие выполняется. После этого i увеличивается на единицу и становится равным 1, т.е. алертом выводится уже 1."зы. СНАЧАЛА сравнение начального i=0 и 5, ПОТОМ увеличение i на 1.

  • Объясните, если я не права :)  

Roman Skritskiy

Вы правы, во второй части первого примера фраза "Первое значение - i=1, по той же причине" неверна. Первым значением будет 0, он сравнивается с 5, потом i увеличивается и выводится 1.

Box4sawa

Мой вариант:  <script>      var a = true      while(a) {        var number = prompt('Enter the number more than 100');        if(number > 100 || number == null)          a = false;      }</script>

    • Мне н