Как работает оператор break в цикле и какой будет вывод
Что проверяют
Понимаете ли вы, из чего именно выходит break в JavaScript и где он не работает вовсе. Обычно показывают цикл с условием и просят назвать вывод, а следом спрашивают, как прервать forEach.
Как отвечать
break сразу завершает ближайший охватывающий цикл (for, while, do...while, for...of, for...in) или switch, выполнение продолжается с первой инструкции после него. В примере for (let i = 0; i < 10; i++) { if (i === 5) break; console.log(i); } выведутся числа от 0 до 4, дальше выполнится код после цикла. Пятёрки нет, потому что проверка стоит до console.log.
Что стоит проговорить сверх базового:
- вложенные циклы:
breakбез метки выходит только из внутреннего. Чтобы выйти из обоих, нужна метка:outer: for (...) { for (...) { break outer; } }; switchвнутри цикла:breakвcaseвыходит изswitch, а не из цикла;forEach,map,filter: колбэк это отдельная функция,breakв нём даётSyntaxError: Illegal break statement, аreturnзавершает лишь текущий вызов колбэка. Для раннего выхода берутfor...of,some,everyилиfind;continue: пропускает остаток итерации, вforперед следующей выполняется шагi++.
В реальном фронтенд-коде ранний выход чаще выглядит как find, some или return из функции, чем как break, и это стоит упомянуть: такой код проще читать.
Хорошее дополнение: break внутри for await...of корректно закрывает итератор, вызывая у него return(), поэтому генератор или поток освобождаются. С forEach и асинхронными колбэками так не выйдет.
Где спотыкаются
Пишут break в forEach и уверены, что перебор остановится. Такой код не проходит даже разбор.
Ошибаются на единицу: забывают, что проверка стоит до console.log, и называют пятёрку среди напечатанного.
Ждут, что break в case остановит внешний цикл, и получают лишние итерации.