(JavaScript) Почему оператор continue внутри ‘if’ в цикле while приводит к сбою браузера?

#javascript #html #for-loop #while-loop

#javascript #HTML #for-цикл #цикл while

Вопрос:

Я хочу написать программу на JavaScript для печати всех чисел от 1 до 20, кроме 5 и 10. Когда я использую цикл for, подобный этому:

 for (x = 1; x <= 20; x  ) {
    if (x == 5 || x == 10) {
        continue;
    }
    document.write(x   ' ');
}
 

Он работает правильно и печатает 1 2 3 4 6 7 8 9 11 12 13 14 15 16 17 18 19 20 .

Однако, когда я пытаюсь использовать цикл while, подобный этому:

 var x = 1;

while (x <= 20) {
    if (x == 5 || x == 10) {
        continue;
    }
    document.write(x   ' ');
    x  ;
}
 

Это делает веб-страницу невосприимчивой, и я получаю приглашение с просьбой закрыть ее. В чем здесь проблема?

Ответ №1:

Проблема заключается в следующем: внутри цикла for continue возвращается к выражению обновления x , но в цикле while он возвращается к состоянию выполнения while(x <= 20)

Ссылка на документы mdn.

В цикле while он возвращается к условию. В цикле for он переходит к выражению update.

Потому что вы не обновляете счетчик внутри своего условия

 while (x <= 20) {
    if (x == 5 || x == 10) {
        continue;            
    }
 

x останется 5 и никогда не обновляется, потому что с continue внутри цикла while он возвращается к текущему состоянию. Это приведет к бесконечному циклу.

Чтобы решить эту проблему, вы можете увеличить счетчик перед оператором continue внутри цикла while

 while (x <= 20) {
    if (x == 5 || x == 10) {
        x  
        continue;
 
 // for (x = 1; x <= 20; x  ) {
//    if (x == 5 || x == 10) {
//        continue;
//    }
//    document.write(x   ' ');
//}


var x = 1;

while (x <= 20) {
    if (x == 5 || x == 10) {
        x  
        continue;
        
    }
    document.write(x   ' ');
    x  ;
} 

Ответ №2:

В первом случае объявление цикла for (x = 1; x <= 20; x ) обрабатывает увеличение x между итерациями, поэтому каждый раз, когда выполняется тело цикла, вы получаете другое значение x .

Во втором случае x выполняется только, если x не является ни 5 nor 10 . Итак, при x достижении 5 этого цикл будет выполняться x = 5 вечно, поскольку его ничто не меняет.