JavaScript to jeden z najpopularniejszych języków programowania, a jego opanowanie jest kluczowe dla aspirujących inżynierów oprogramowania. Znajomość pętli, ich rodzajów i działania stanowi fundament tej nauki.
Pętle w JavaScript umożliwiają wielokrotne wykonywanie fragmentów kodu w zależności od określonego warunku. Iteracja, czyli powtarzanie w kontekście pętli, trwa do momentu, aż warunek zakończenia zostanie spełniony. Pomyśl o tym, jak o serii ruchów w grze – wykonujesz określoną liczbę kroków w danym kierunku, aż osiągniesz cel.
Przykładowo, wykonanie siedmiu kroków na północ można zapisać w kodzie w następujący sposób:
for (let krok = 0; krok < 7; krok++) { // Wykona się 7 razy, z wartościami kroku od 0 do 6. console.log("Idę na północ o jeden krok"); }
Po uruchomieniu tego kodu, zobaczymy efekt w konsoli.
W jakim celu stosuje się pętle?
- Powtarzanie zadań: Pętle pozwalają na wykonywanie zestawu instrukcji dopóki określone kryteria nie zostaną spełnione.
- Przeglądanie obiektów i tablic: Dzięki pętlom można iterować przez właściwości obiektów lub elementy tablic, wykonując działania dla każdej z nich.
- Filtrowanie danych: Pętle umożliwiają selekcję danych na podstawie określonych reguł.
W JavaScript istnieje kilka rodzajów pętli: for, while, do…while, for…in oraz for…of. Przyjrzyjmy się im bliżej, analizując ich działanie.
Pętla „for”
Pętla „for” powtarza instrukcje do momentu, aż warunek przestanie być spełniony. Składa się z trzech opcjonalnych wyrażeń, po których następuje blok kodu.
for (inicjalizacja; warunek; wyrażenie_końcowe) { // kod }
- Wyrażenie inicjalizujące jest wykonywane przed pierwszym przebiegiem pętli i służy zazwyczaj do inicjalizacji liczników.
- Wyrażenie warunkowe jest sprawdzane przed każdym wykonaniem pętli. Kod w pętli jest wykonywany, jeśli warunek jest prawdziwy. Jeśli warunek jest fałszywy, pętla się kończy. Brak warunku domyślnie traktowany jest jako warunek prawdziwy.
- Wyrażenie końcowe jest wykonywane po każdej iteracji i zazwyczaj służy do zwiększania wartości licznika.
Do grupowania instrukcji w bloku można użyć nawiasów klamrowych {}. Aby przerwać pętlę wcześniej, przed uzyskaniem warunku fałszywego, należy zastosować instrukcję „break”.
Przykłady użycia pętli „for”
for (let i = 0; i < 7; i++) { console.log(i); }
W tym przypadku:
- Zmienna „i” jest inicjalizowana wartością 0 (let i = 0).
- Warunkiem jest, aby „i” było mniejsze niż 7 (i < 7).
- Pętla będzie się powtarzać, dopóki wartość „i” nie będzie mniejsza niż 7.
- Po każdej iteracji wartość „i” zostanie zwiększona o 1 (++i).
for (let i = 1; i < 11; i += 2) { if (i === 9) { break; } console.log('Liczba programistów: ' + i); }
- Kod iteruje od 1 do 10 (i < 11).
- Zmienna „i” jest inicjalizowana wartością 1 (let i = 1).
- Pętla trwa dopóki „i” jest mniejsze od 11.
- Wartość „i” wzrasta o 2 po każdym przebiegu (i += 2).
Instrukcja „if” sprawdza, czy wartość „i” wynosi 9. Jeśli tak, to „break” przerywa działanie pętli.
(obraz)
Pętla „for…of”
Pętla „for…of” iteruje po obiektach iterowalnych, takich jak mapy, tablice, argumenty i zbiory. Wywołuje niestandardowy hak iteracji z instrukcjami wykonywanymi dla każdej wartości danego obiektu.
Podstawowa struktura pętli „for…of” to:
for (zmienna of obiekt) instrukcja
Przykłady użycia pętli „for…of”
const jezykiFrontend = [ "HTML", "CSS", "JavaScript" , "React"]; for (let i of jezykiFrontend) { console.log(i); }
W tym kodzie:
- Definiujemy tablicę o nazwie „jezykiFrontend”.
- Tablica zawiera elementy: „HTML”, „CSS”, „JavaScript” i „React”.
- Pętla „for…of” iteruje po każdym elemencie w tablicy.
- Zmienna „i” przyjmuje wartość kolejnych elementów podczas każdej iteracji, a następnie te wartości są wyświetlane w konsoli.
const s = new Set(); s.add(2); s.add("szary"); for (let n of s) { console.log(n); }
W tym fragmencie kodu:
- Deklarujemy zmienną „s”, do której przypisujemy nowy zbiór utworzony za pomocą konstruktora „Set()”.
- Do zbioru dodajemy dwa elementy za pomocą metody „add()”.
- Pętla „for…of” iteruje po elementach zbioru.
- Pętla przypisuje wartość bieżącego elementu do „n” przed wykonaniem instrukcji „console.log(n)”.
const m = new Map(); m.set(4, "królik"); m.set(6, "małpa"); m.set(8, "słoń"); m.set(10, "lew"); m.set(12, "leopard"); for (let n of m) { console.log(n); }
W tym bloku kodu:
- Używamy konstruktora „Map()” do stworzenia nowego obiektu „Map”.
- Deklarujemy zmienną „m”.
- Dodajemy pięć par klucz-wartość za pomocą metody „.set()”.
- Pętla „for…of” iteruje po elementach obiektu „Map” o nazwie „m”.
Pętla „for…in”
Pętla „for…in” służy do iterowania po właściwościach obiektu. Podstawowa struktura pętli „for…in” wygląda następująco:
for (właściwość in obiekt) { // kod }
Pętlę „for…in” można wykorzystać do iterowania po tablicach i obiektach przypominających tablice.
const listaZakupow = { jarmuz: 4, pomidory: 2, kapusta: 0, salata: 6, dynia: 5 }; for (const warzywo in listaZakupow) { console.log(warzywo); }
W tym przykładzie:
- Tworzymy obiekt JavaScript o nazwie „listaZakupow”.
- Używamy pętli „for” do iterowania po każdej właściwości „listaZakupow” za pomocą operatora „in”.
- W każdej iteracji pętla przypisuje bieżącą nazwę właściwości z obiektu „listaZakupow”.
Pętla „while”
Pętla „while” sprawdza warunek, a jeśli jest on prawdziwy, wykonuje blok kodu. Jeśli warunek jest fałszywy, pętla kończy działanie, a kod w jej bloku nie jest wykonywany.
Podstawowa struktura pętli „while” to:
while (warunek) instrukcja
Warunek musi zostać sprawdzony przed wykonaniem instrukcji w pętli. Można wykonać kilka instrukcji, używając nawiasów klamrowych {} lub instrukcji blokowych.
Przykład użycia pętli „while”
let n = 0; while (n < 9) { console.log(n); n++; }
W tym kodzie:
- Zmienna „n” jest inicjalizowana wartością zero (let n = 0).
- Pętla będzie wykonywana, dopóki wartość „n” będzie mniejsza niż 9 (n < 9).
- Wartość „n” jest wyświetlana w konsoli i zwiększana o 1 po każdej iteracji (n++).
- Kod przestanie działać, gdy „n” osiągnie wartość 9.
Pętla „do…while”
Pętla „do…while” wykonuje iterację, dopóki warunek nie zostanie oceniony jako fałszywy.
Ogólna struktura instrukcji „do…while” jest następująca:
do instrukcja while (warunek);
Instrukcja jest wykonywana raz, a następnie sprawdzany jest warunek. Instrukcja zostanie ponownie wykonana, jeśli warunek jest prawdziwy. W przeciwnym razie wykonywanie pętli zostanie zatrzymane, a sterowanie przejdzie do instrukcji następującej po „do…while”. Kod w pętli „do…while” gwarantuje wykonanie co najmniej raz, nawet jeśli warunek początkowo ma wartość false.
Przykład użycia pętli „do…while”
let n = 0; do { n += 1; console.log(n); } while (n < 7);
W tym kodzie:
- Tworzymy zmienną „n” i ustawiamy jej wartość początkową na 0 (let n = 0).
- Zmienna „n” wchodzi do pętli „do…while”, gdzie jej wartość jest zwiększana o 1 po każdej iteracji (n += 1).
- Wartość „n” jest wyświetlana w konsoli.
- Pętla będzie wykonywana, dopóki wartość „n” będzie mniejsza niż 7 (n < 7).
Po uruchomieniu tego kodu, konsola wyświetli wartości „n” od 1 do 7, ponieważ pętla wykona się 7 razy.
Zagnieżdżone pętle
Zagnieżdżona pętla to sytuacja, w której jedna pętla znajduje się wewnątrz innej. Na przykład, możemy mieć pętlę „for” zagnieżdżoną w innej pętli „for”.
for (let zewnętrzna = 0; zewnętrzna < 5; zewnętrzna += 2) { for (let wewnętrzna = 0; wewnętrzna < 6; wewnętrzna += 2) { console.log(`${zewnętrzna}-${wewnętrzna}`); } }
- Istnieją dwie zmienne: „zewnętrzna” i „wewnętrzna”, obie zainicjowane wartością zero.
- Obie zmienne są zwiększane o 2 po każdej iteracji.
- Zarówno pętla zewnętrzna, jak i wewnętrzna wykonują po trzy iteracje.
Instrukcje sterujące pętlą
Instrukcje sterujące pętlą, zwane też „instrukcjami skoku”, przerywają normalny przebieg programu. Przykłady to instrukcje „break” i „continue”.
Instrukcja „break”
Instrukcja „break” natychmiast przerywa działanie pętli, nawet jeśli warunek nie został jeszcze spełniony.
for (let n = 1; n <= 26; n++) { if (n === 13) { console.log("Pętla zatrzymuje się tutaj. Osiągnięto instrukcję 'break'"); break; } console.log(n); }
Kod po wykonaniu wyświetli:
Instrukcja „continue”
Instrukcja „continue” służy do pominięcia określonego bloku kodu i przejścia do następnej iteracji pętli.
for (let n = 0; n <= 10; n++) { if (n === 5) { continue; } console.log(n); }
Kod po wykonaniu wyświetli:
Podsumowanie
Powyżej przedstawiono najczęściej spotykane pętle w JavaScript oraz jego frameworkach i bibliotekach. Jak podkreślono, każdy typ pętli ma swoje specyficzne zastosowanie i zachowanie. Wybranie niewłaściwego typu pętli może prowadzić do błędów i nieoczekiwanego działania kodu.
W przypadku korzystania z frameworka lub biblioteki JavaScript, zawsze należy dokładnie sprawdzać jej dokumentację i wykorzystywać wbudowane w nią pętle.