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:
for (var i=0, n=arr.length; i < n; ++i ) {
...
}
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 z for
.
Korzyści:
- wydajny
- wczesne zakończenie pętli (wyróżnienia
break
i continue
)
- kontrola warunku (
i<n
może być dowolna i nie jest powiązana z rozmiarem tablicy)
- zmienny zasięg (
var i
liście i
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 jak Map
i Set
). Są nowsze i zapewniają subiektywnie łatwiejszy do odczytania kod. Przykład:
[].forEach((val, index)=>{
...
});
Korzyści:
- nie wymaga konfiguracji zmiennych (iteruje po każdym elemencie tablicy)
- funkcje / funkcje-strzałek określają zakres zmiennej do bloku
W powyższym przykładzie val
byłby to parametr nowo utworzonej funkcji. W ten sposób wszystkie zmienne wywoływane val
przed pętlą będą miały swoje wartości po jej zakończeniu.
- subiektywnie łatwiejsze w utrzymaniu, ponieważ może być łatwiej zidentyfikować, co robi kod - iteruje po wyliczalnym; podczas gdy pętla for może być używana dla dowolnej liczby schematów pętli
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ę:
for (var i=0; i < arr.length; ++i ){}
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ć:
for (var i=0, n=arr.length; i < n; ++i){}
Robi to samo, ale pobiera tylko arr.length
raz, buforując zmienną i optymalizując kod.