UPDATE:
Wiele starych sztuczek w tych odpowiedzi są idealne dla interpretowane JS w starszych przeglądarkach.
W każdej nowoczesnej implementacji JS, w tym we wszystkich nowoczesnych przeglądarkach, węźle i najnowszych odsłonach witryn mobilnych, funkcje wbudowane mogą być faktycznie buforowane przez JIT (kompilator JS), co czyni opcję znacznie szybszą dla iteracji macierzy. Kiedyś po prostu nawiązywanie połączeń z funkcją wielokrotnie wymagało procesu kompilacji/rozpadu, który mógłby znacznie obniżyć wydajność nietrywialnej pętli.
Aby uzyskać najlepszą wydajność, unikałbym odniesienia do wszystkiego, co nie zostało przekazane jako argument lub zdefiniowane w samej funkcji, jeśli nie musisz tego robić. Nie jestem w 100% pewien, że to ma znaczenie, ale mogłem zrozumieć, dlaczego tak się stało.
Wartości gettera, które obejmują dowolny proces wyszukiwania, taki jak długość macierzy lub właściwości węzła DOM, prawdopodobnie są nadal najlepiej buforowane do zmiennej.
Ale staram się po prostu pozwolić, by podstawowa zasada unikania pracy poprowadziła twoje perfekcyjne wysiłki. Wstępne obliczanie rzeczy, które nie muszą być ponownie obliczane w pętli lub buforowanie wyniku selektora zapytania do var, zamiast wielokrotnego grzebania w DOM, są tego dobrym przykładem. Próby zbyt dużego wysiłku, aby skorzystać z zachowania JIT, zapewne staną się bardzo tajemnicze i prawdopodobnie nie utrzymają się w czasie lub we wszystkich JIT.
OLD ODPOWIEDŹ:
Dobra, zapomnij ścianę tekstu. wypunktowania:
var i = someArray.length; //length is cached
someArray.reverse(); //include this only if iterating in 0-(length-1) order is important
while(i--){
//run a test statement on someArray[i];
}
długość jest buforowane i natychmiast wprowadzone do indeksu
Zaletą iteracji wstecz w JS AFAIK jest unikanie operator logiczny z dwoma argumentami. W tym przypadku po prostu oceniamy liczbę. To prawda albo zero i fałsz.
Uważam też, że jest elegancka.
'forEach' prawdopodobnie ma pewne natywne optymalizacje lub coś. –
Co więcej, nie dostajesz nawet wartości z tablicy w Przypadku testowym 1, logujesz się i zamiast 'tablica [i]' –
1) nie powinieneś tworzyć tablicy przy każdym teście, możesz zdefiniować vars, które będą dostępne we wszystkich testach 2) sprawdzasz '.length' w każdej pętli – ajax333221