Znalazłem następującą adnotację w pętli w dużym projekcie, nad którym pracuję (pseudokod):
var someOtherArray = [];
for (var i = 0, n = array.length; i < n; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
To, co zwróciło moją uwagę, to ta dodatkowa zmienna „n”. Nigdy wcześniej nie widziałem napisanego w ten sposób for for lop.
Oczywiście w tym scenariuszu nie ma powodu, dla którego ten kod nie mógłby zostać napisany w następujący sposób (do czego jestem bardzo przyzwyczajony):
var someOtherArray = [];
for (var i = 0; i < array.length; i++) {
someOtherArray[i] = modifyObjetFromArray(array[i]);
}
Ale przyszło mi do głowy.
Czy istnieje scenariusz, w którym napisanie takiej pętli for miałoby sens? Przychodzi mi na myśl, że długość „tablicy” może się zmieniać podczas wykonywania pętli for, ale nie chcemy zapętlać dalej niż pierwotny rozmiar, ale nie wyobrażam sobie takiego scenariusza.
Zmniejszenie tablicy wewnątrz pętli również nie ma większego sensu, ponieważ prawdopodobnie otrzymamy OutOfBoundsException.
Czy istnieje znany wzorzec projektowy, w którym ta adnotacja jest przydatna?
Edytuj Jak zauważył @ Jerry101 przyczyną jest wydajność. Oto link do testu wydajności, który utworzyłem: http://jsperf.com/ninforloop . Moim zdaniem różnica nie jest wystarczająco duża, chyba że iterujesz przez bardzo dużą tablicę. Kod, z którego go skopiowałem, miał tylko do 20 elementów, więc myślę, że czytelność w tym przypadku przeważa nad wydajnością.
n
może być wolniejsze niż użycie wariantu, array.Length
ponieważ JITter może nie zauważyć, że może wyeliminować sprawdzanie granic tablicy.