A diferença mais substantiva entre o forloop e o forEachmétodo é que, com o primeiro, você pode breaksair do loop. Você pode simular continuesimplesmente retornando da função passada para forEach, mas não há como parar completamente o loop.
Além disso, os dois realizam efetivamente a mesma funcionalidade. Outra pequena diferença envolve o escopo do índice (e todas as variáveis que contêm) no loop for, devido ao içamento de variável.
// 'i' is scoped to the containing function
for (var i = 0; i < arr.length; i++) { ... }
// 'i' is scoped to the internal function
arr.forEach(function (el, i) { ... });
No entanto, acho que forEaché muito mais expressivo - representa sua intenção de iterar por meio de cada elemento de um array e fornece uma referência ao elemento, não apenas ao índice. No geral, tudo se resume ao gosto pessoal, mas se você puder usar forEach, eu recomendo.
Existem algumas diferenças mais substanciais entre as duas versões, especificamente em relação ao desempenho. Na verdade, o loop for simples tem um desempenho consideravelmente melhor do que o forEachmétodo, conforme demonstrado por este teste jsperf .
Se essa performance é ou não necessária para você, cabe a você decidir e, na maioria dos casos, eu preferiria a expressividade à velocidade. Essa diferença de velocidade provavelmente se deve às pequenas diferenças semânticas entre o loop básico e o método ao operar em matrizes esparsas, conforme observado nesta resposta .
Se você não precisa do comportamento forEache / ou precisa sair do loop antes, pode usar o Lo-Dash _.eachcomo alternativa, que também funcionará em vários navegadores. Se você estiver usando jQuery, ele também fornece um similar $.each, apenas observe as diferenças nos argumentos passados para a função de retorno de chamada em cada variação.
(Quanto ao forEachpolyfill, ele deve funcionar em navegadores mais antigos sem problemas, se você optar por seguir esse caminho.)
breaksairforEach. Mas uma grande vantagem é criar um novo escopo com a função. Com o polyfill você não deve ter problemas (pelo menos eu não encontrei nenhum).