Как прервать цикл без выхода из функции
Что проверяют
Различаете ли вы break, continue и return и знаете ли, какие конструкции в JavaScript вообще можно прервать. Почти всегда следом спрашивают: «А как выйти из forEach?» и «Как выйти сразу из двух вложенных циклов?».
Как отвечать
break: завершает ближайший цикл (for,while,do...while,for...of,for...in), и выполнение продолжается с первой строки после него. Функция работает дальше;continue: пропускает остаток текущей итерации и переходит к следующей;return: выходит из всей функции, это как раз то, что по условию делать нельзя;- метки: для вложенных циклов пишут
outer: for (...) { for (...) { if (found) break outer; } }. Прерываются оба цикла, а код после внешнего выполняется.
Отдельно скажите про методы массивов. forEach прервать нельзя: break внутри колбэка это SyntaxError, а return в колбэке лишь переходит к следующему элементу. Если нужна досрочная остановка, берите for...of или метод, который останавливается сам: some() прекращает обход на первом true, every() на первом false, find() и findIndex() на первом совпадении.
Хорошая деталь для сильного ответа: break в for...of вызывает у итератора метод return(), поэтому блок finally внутри генератора выполнится и ресурсы освободятся.
Где спотыкаются
Отвечают «через return». Цикл остановится, но вместе с ним завершится функция, и код после цикла не выполнится.
Ставят break внутри switch, который лежит в цикле, и ждут выхода из цикла. Такой break выходит только из switch, для цикла нужна метка или флаг.
Предлагают бросить исключение в forEach и поймать его снаружи. Работает, но это управление потоком через ошибки: код хуже читается и маскирует настоящие исключения. for...of с break решает ту же задачу честно.