Чтобы задать подобный вопрос, надо не знать, что такое
forEach и
for...of. Откройте документацию и разберитесь.
UPD. Что, никак? Ну вот вам тогда несколько моментов:
Выполнение
forEach нельзя прервать (
throw не в счёт), в то время как в теле
for...of можно использовать
break и
return (да, в
forEach тоже можно использовать
return, но эффект будет не тот - уход на следующую итерацию, т.е., то же, что и
continue для
for...of).
В
forEach можно назначать контекст выполнения (через второй параметр, коллбек при этом не должен быть стрелочной функцией).
Не удастся заставить
forEach отложить запуск следующей итерации до окончания выполнения асинхронных операций, запущенных в текущей итерации. В случае
for...of можно добавить
async в объявление функции, внутри которой он находится, и использовать
await.
Если в прототипе объекта есть
Symbol.iterator, то это ещё не означает, что и
forEach там тоже присутствует. Впрочем, тут могут быть (не всегда), варианты одолжить чужой
forEach:
Array.prototype.forEach.call('ABC', alert);
NodeList.prototype.forEach.call(document.scripts, console.log);
Дальше сами думайте, где что предпочтительнее будет использовать.