Jaki jest obecny standard w 2017 roku w Javascript z pętlami for () w porównaniu z .forEach.
Obecnie pracuję nad „Web Dev Bootcamp” Colta Steelesa na Udemy i on faworyzuje forEach
go for
w swoich naukach. Szukałem jednak różnych rzeczy podczas ćwiczeń w ramach kursu i znajduję coraz więcej zaleceń, aby używać for
raczej -loopa niż forEach
. Większość ludzi uważa, że pętla for jest bardziej wydajna.
Czy to się zmieniło od czasu napisania kursu (około 2015 roku), czy też są ich naprawdę wady i zalety każdego z nich, czego nauczysz się z większym doświadczeniem.
Każda rada byłaby bardzo mile widziana.
javascript
loops
for-loop
foreach
tonyrobbins
źródło
źródło
for
jest trudny do pokonania dla czystej prędkości.forEach()
wywołuje wywołanie zwrotne dla każdej iteracji; więc to oczywiście wiąże się z pewnym obciążeniem.map
wyłącznie do iteracji i odrzucają nową tablicę, którą generuje. Nie wiem, ile osób musiałem poprawić w przypadku tego konkretnego wyboru funkcji na tej samej stronie.Odpowiedzi:
dla
for
pętle są znacznie wydajniejsze. Jest to konstrukcja pętli zaprojektowana specjalnie do iteracji, gdy warunek jest prawdziwy , jednocześnie oferując mechanizm krokowy (zwykle w celu zwiększenia iteratora). Przykład:Nie jest to sugerować, że za będzie -loops zawsze być bardziej wydajny, wystarczy, że silniki JS i przeglądarek zoptymalizowano je tak być. Przez lata pojawiały się kompromisy co do tego, która konstrukcja pętli jest bardziej wydajna (np. Redukuj, odwracaj podczas itd.) - różne przeglądarki i silniki JS mają własne implementacje, które oferują różne metodologie, aby generować te same wyniki. Ponieważ przeglądarki dalej optymalizują się, aby sprostać wymaganiom wydajności, teoretycznie
[].forEach
można je zaimplementować w taki sposób, aby był szybszy lub porównywalny zfor
.Korzyści:
break
icontinue
)i<n
może być dowolna i nie jest powiązana z rozmiarem tablicy)var i
liściei
dostępne po zakończeniu pętli)dla każdego
.forEach
to metody, które głównie iterują po tablicach (także po innych wyliczalnych obiektach , takich jakMap
iSet
). Są nowsze i zapewniają subiektywnie łatwiejszy do odczytania kod. Przykład:Korzyści:
W powyższym przykładzie
val
byłby to parametr nowo utworzonej funkcji. W ten sposób wszystkie zmienne wywoływaneval
przed pętlą będą miały swoje wartości po jej zakończeniu.Występ
Wydajność to trudny temat, który zwykle wymaga pewnego doświadczenia, jeśli chodzi o przezorność lub podejście. Aby określić z wyprzedzeniem (podczas opracowywania), ile optymalizacji może być wymagane, programista musi mieć dobre wyobrażenie o wcześniejszych doświadczeniach z przypadkiem problemowym, a także dobre zrozumienie potencjalnych rozwiązań.
Korzystanie z jQuery w niektórych przypadkach może być czasami zbyt wolne (doświadczony programista może to wiedzieć), podczas gdy innym razem może nie stanowić problemu, w takim przypadku zgodność biblioteki z różnymi przeglądarkami i łatwość wykonywania innych funkcji (np. AJAX, obsługa zdarzeń) byłaby warta zaoszczędzonego czasu na rozwój (i utrzymanie).
Innym przykładem jest to, że gdyby wydajność i optymalizacja były wszystkim, nie byłoby innego kodu niż maszyna lub zespół. Oczywiście tak nie jest, ponieważ istnieje wiele różnych języków wysokiego i niskiego poziomu, z których każdy ma swoje własne kompromisy. Te kompromisy obejmują między innymi specjalizację, łatwość i szybkość programowania, łatwość i szybkość konserwacji, zoptymalizowany kod, kod wolny od błędów itp.
Podejście
Jeśli nie masz dobrego zrozumienia, czy coś będzie wymagało zoptymalizowanego kodu, ogólnie dobrą zasadą jest, aby najpierw napisać kod, który można konserwować. Stamtąd możesz przetestować i wskazać, co wymaga więcej uwagi, gdy jest to wymagane.
To powiedziawszy, pewne oczywiste optymalizacje powinny być częścią ogólnej praktyki i nie wymagają żadnej refleksji. Weźmy na przykład pod uwagę następującą pętlę:
Dla każdej iteracji pętli JavaScript
arr.length
pobiera operację kalkulacji kosztów wyszukiwania kluczy w każdym cyklu. Nie ma powodu, dla którego nie powinno to być:Robi to samo, ale pobiera tylko
arr.length
raz, buforując zmienną i optymalizując kod.źródło
[...], if performance and optimization was everything, there would be no other code than machine or assembly.
. Uważam, że wlet
przypadku deklaracji zmiennej lokalnej o zasięgu blokowym druga korzyśćforEach
nie jest już przewagą nadfor
pętlą, chyba że w środowisku bez wsparcialet
.