Циклы while, for

 Циклы нужны для многократного повторения участка кода. Например, шагать от дома и до работы, или каждому члену семьи дать по подарку.

Цикл while - делать что-то пока не

    while ( ... ) { ... }

Его более редкая разновидность

    do { ... } while ( ... )

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

Очень часто используется цикл for

    for ( var i = 0; i < str.length; i++ ) {
        ...
    }

Здесь мы перебрали все символы строки

Предположим, нужно перебрать все символы строки, пока не дойдём до мягкого знака (если он есть)
Такой цикл будет выглядеть как

    for ( var i = 0; i < str.length; i++ ) {
         ...
        if ( str[i ]== "ь" ) break;
    }

Дойдя до  мягкого знака цикл остановится

Может быть вариант, когда что-то нужно сделать с каждым символом строки кроме мягкого  знака.
Тогда пишем так:

    for ( var i = 0; i < str.length; i++ ) {
        if ( str[i] == "ь" ) continue;
        ...
    }

Инструкции break и continue прерывают выполнение цикла. Разница в том, что break прерывает весь цикл полностью, а continue только его текущую итерацию

Задача
Какие значения будет принимать n в следующем цикле:

i = 0;
n = 0;
while (i < 5) {
   i++;
   if (i === 3) {
      continue;
   }
   n += i;
}

Ответ: 1, 3, 7, 12

Метки
Предположим, что есть два цикла вложенных друг в друга. И вот ми хотим, чтобы при наступлении определённого условия во внутреннем цикле остановился и внешний цикл тоже.
Для этого используем метку.

label: for ( var i = 0; i < str.length; i++ ) {
        for ( var j = 0; j < 10; j++ ) {
            ...
            if(j = 3) continue label;

        }
    }


Про метки можно прочитать здесь https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/label
И там красным цветом выделена рекомендация

  ! Избегайте использования меток  


Задача

Какие значения i выведет цикл for?

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

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


Ответ: достаточно неожиданно, но никакой разницы в результатах этих выражений нет, независимо от постфиксной или префиксной инкрементации  i будет принимать значения от 0 до 4

Пояснение к ней

Такой результат обусловлен алгоритмом работы for:

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

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

Задача
При помощи цикла for выведите чётные числа от 2 до 10.

Моё решение:

    for (var i = 1; i <=10; i++) {
        if (i % 2 == 1) continue;
         alert(i);
    }


Решение с сайта:
    for (var i = 2; i <= 10; i++) {
         if (i % 2 == 0) {
        alert( i );
        }
    }


Моё мне нравится больше. В нём меньше скобок и ниже вложенность. Это хорошо.

Задача
Создайте код, который выводит все простые числа из интервала от 2 до 10. Результат должен быть: 2,3,5,7.
P.S. Код также должен легко модифицироваться для любых других интервалов.

Моё решение, и оно неправильное

function prime(n) {
  for (var i = 2; i <= n; i++) {
    for (var j = 2; j <= i; j++) {
      if (i != j && i % j == 0) continue;
      else alert(i);
    }
  }
}

prime(10)


А вот такое решение правильное

function prime(n) {
  label:
  for (var i = 2; i <= n; i++) {
    for (var j = 2; j <= i; j++) {
      if (i != j && i % j == 0) continue label;
      else alert(i);
    }
  }
}

prime(10)


Хороший пример использования метки в цикле