Zależy od języka i preferencji danego programisty. Oraz jaki mamy cel, po co chcemy iterować.
W JS:
jeśli chcę przejechać przez elementy tablicy, to robię zwykle .forEach:
Kopiuj
someArray.forEach(el => { console.log(el); });
jest to bardziej "skrótowe" niż pętla for i niektórzy się tym zachwycili i zaczęli rzucać teksty "nie używam już pętli for".
Tylko, że to krótkowzroczne myślenie. Pętla for pozwala na większą elastyczność. Np. iterację od tyłu (przydatne przy usuwaniu elementów). Albo dowolną iterację, nie tylko po tablicach. Również za pomocą for można przerwać iterację w trakcie, co też bywa zaletą. Np. jeśli element znaleziony, to nie musisz dalej przeszukiwać...
...ale z kolei do szukania elementów dodano metody find, findIndex , findLast, findLastIndex.
Dalej. Jeśli chcemy zamienić jedną tablicę w drugą, to mamy od tego map, które całkiem wygodnie pozwala na takie rzeczy.
myArray.filter().map()...
Taki kod również jest przydatny - najpierw przefiltrować tablicę i potem przemapować.
(jednak to, że tak można zrobić w pewnych przypadkach nie kasuje przydatności pętli for czy innych sposobów iteracji).
Dalej mamy reduce, które też jest przydatne jeśli chcemy zrobić z wielu elementów jeden (np. policzyć sumę elementów).
Natomiast ponieważ reduce jest dość elastycznym sposobem iteracji, to ludzie zaczęli tego nadużywać. W szczególności zobaczysz kody, które mutują pierwszy argument - np. dodają coś do obiektu, to częsty pattern:
Kopiuj
someArray.reduce((acc, v, i) => { acc[v] = i; return acc }, {})
chociaż to hak i używanie czegoś niezgodnie z przeznaczeniem (bo reduce kojarzy się z programowaniem funkcyjnym, więc mutacja trochę nie bardzo pasuje). Chociaż nie jestem radykałem, sam tak robiłem. Nawiasem mówiąc powyższy przykład z reduce można i tak zapisać krócej używając Object.fromEntries:
Kopiuj
Object.fromEntries(someArray.map((v,i) => [v,i]))
Jeśli chcemy utworzyć obiekt na podstawie tablicy.
W innych przypadkach użycie reduce można przepisać np. do zwykłej pętli for czy użycia metody .forEach. I często jest to bardziej czytelne (reduce ma dziwną skłonność zaciemniania kodu, bo często ludzie tam wrzucają imperatywny kod, ale pisany tak, żeby imitować programowanie funkcyjne).
Więc jeśli już ograniczyć się w używaniu czegoś, to sugerowałbym ostrożność w użyciu reduce ;) można oczywiście używać, ale łatwo napisać coś mało czytelnego używając reduce.
Długi post wyszedł, ale i tak tylko liznąłem temat. Bo poruszyłem tylko iterację po tablicach (a można jeszcze iterować po obiektach, iterablach itp.) oraz przez pętlę for mam na myśli for (init; cond; after) a w JS jest jeszcze pętla for... in, for... of czy for await...of.
Anyway, nie daj sobie wmówić głupot, że pętla for jest be. Wszystko zależy co robisz.
No i jeszcze są pętle while czy do while, które też są przydatne, chociaż rzadziej (ale np. przy implementacji różnych algorytmów mogą się przydać).