Najbardziej istotna różnica między forpętlą a forEachmetodą polega na tym, że w przypadku tej pierwszej możesz breakwyjść z pętli. Możesz symulować continue, po prostu wracając z funkcji przekazanej do forEach, ale nie ma sposobu, aby całkowicie zatrzymać pętlę.
Poza tym oba te rozwiązania skutecznie realizują tę samą funkcjonalność. Inna niewielka różnica dotyczy zakresu indeksu (i wszystkich zawierających zmienne) w pętli for, ze względu na zmienne podnoszenie.
for (var i = 0; i < arr.length; i++) { ... }
arr.forEach(function (el, i) { ... });
Jednak forEachwydaje mi się, że jest to dużo bardziej wyraziste - reprezentuje zamiar iteracji przez każdy element tablicy i zapewnia odniesienie do elementu, a nie tylko do indeksu. Ogólnie rzecz biorąc, sprowadza się to głównie do osobistego gustu, ale jeśli możesz go użyć forEach, polecam go.
Pomiędzy tymi dwiema wersjami występuje kilka bardziej istotnych różnic, w szczególności dotyczących wydajności. W rzeczywistości prosta pętla for działa znacznie lepiej niż forEachmetoda, co wykazano w tym teście jsperf .
To, czy takie wykonanie jest dla Ciebie konieczne, zależy od Ciebie, aw większości przypadków wolałbym wyrazistość niż szybkość. Ta różnica szybkości jest prawdopodobnie spowodowana niewielkimi różnicami semantycznymi między podstawową pętlą a metodą podczas pracy na rzadkich tablicach, jak wspomniano w tej odpowiedzi .
Jeśli nie potrzebujesz zachowania forEachi / lub musisz wcześnie wyrwać się z pętli, możesz użyć Lo-Dash _.eachjako alternatywy, która będzie działać również w różnych przeglądarkach. Jeśli używasz jQuery, zapewnia on również podobny $.each, po prostu zwróć uwagę na różnice w argumentach przekazywanych do funkcji zwrotnej w każdej wariacji.
(Jeśli chodzi o forEachpolyfill, powinien działać w starszych przeglądarkach bez problemów, jeśli wybierzesz tę trasę.)
breakwyjśćforEach. Ale dużą zaletą jest utworzenie nowego zakresu z funkcją. Z polyfillem nie powinieneś mieć żadnych problemów (przynajmniej ja żadnych nie spotkałem).