Budowa instrukcji if
Instrukcja if wykonuje blok kodu tylko wtedy, gdy warunek jest prawdziwy. Składa się ze słowa kluczowego, warunku w nawiasach i bloku w nawiasach klamrowych:
Warunek age >= 18 daje true, więc blok się wykonuje. Gdyby age wynosiło 16, warunek dałby false i JavaScript całkowicie pominąłby blok.
Nawiasy klamrowe są technicznie opcjonalne, gdy blok zawiera jedną instrukcję, ale zawsze ich używaj. Instrukcje if bez klamer to klasyczne źródło błędów, gdy ktoś później dopisze drugą linię i zapomni, że wcale nie jest ona w bloku.
else: gałąź awaryjna
Połącz if z else, żeby wykonać inny kod, gdy warunek jest fałszywy:
Wykonuje się dokładnie jedna z dwóch gałęzi. Nigdy obie i nigdy żadna. else nie ma własnego warunku: łapie wszystko, gdy „if okazał się fałszywy”.
else if: wybór z kilku opcji
Gdy masz więcej niż dwa przypadki, połącz je w łańcuch przez else if. JavaScript sprawdza warunki po kolei i zatrzymuje się na pierwszym prawdziwym:
Wykonuje się tylko jedna gałąź. Gdy warunek zostanie dopasowany, reszta jest pomijana, nawet jeśli też byłaby prawdziwa. Dlatego kolejność ma znaczenie: gdybyś odwrócił łańcuch i najpierw sprawdzał score >= 60, każdy powyżej 60 dostałby D.
Końcowe else jest opcjonalne, ale jego dodanie jasno pokazuje intencję: „jeśli nic innego nie pasowało, zrób to”.
Warunkiem może być dowolne wyrażenie
To, co stoi w nawiasach, nie musi być porównaniem. Może to być dowolne wyrażenie, a JavaScript zamieni wynik na wartość logiczną:
Niepuste stringi są truthy. 0 i pusty string są falsy, więc items.length równe 0 kieruje do gałęzi else. To standardowy idiom JavaScript na sprawdzenie, czy „coś tam jest”.
Pełna lista wartości falsy jest krótka i warto ją zapamiętać: false, 0, -0, 0n, "", null, undefined i NaN. Wszystko inne jest truthy, łącznie z "0", "false", [] i {}. Na dwóch ostatnich ludzie często się łapią.
Łączenie warunków: && i ||
Używaj && (i) oraz || (lub), żeby łączyć warunki:
&& wymaga, żeby obie strony były truthy. || wymaga co najmniej jednej. Oba operatory działają na zasadzie short-circuit: && zatrzymuje się na pierwszej wartości falsy, || na pierwszej truthy. Ma to znaczenie, gdy drugi warunek ma efekt uboczny albo mógłby rzucić błąd: user && user.name bezpiecznie zwraca undefined, gdy user to null, zamiast wysadzić program.
Mieszaną logikę owijaj w nawiasy, żeby kolejność działań była oczywista:
Bez nawiasów && wiąże mocniej niż ||, co zwykle jest odwrotnością tego, jak czyta się to naturalnie.
== kontra === (używaj ===)
Sprawdzając równość w if, używaj === i !==, a nie == i !=:
== konwertuje typy przed porównaniem, co prowadzi do niespodzianek, takich jak "" == 0 dające true czy null == undefined dające true. === porównuje bez konwersji: ten sam typ i ta sama wartość. Domyślnie używaj ===. Jedynym popularnym wyjątkiem jest x == null, które za jednym razem sprawdza i null, i undefined.
Operator trójargumentowy
Do wyboru między dwiema wartościami operator trójargumentowy condition ? a : b jest często czytelniejszy niż pełne if/else:
Operator trójargumentowy to wyrażenie: daje wartość. To kluczowa różnica wobec if/else, które jest instrukcją. Używaj go, gdy potrzebujesz wyniku (przypisanie zmiennej, return, budowanie stringa). Używaj if/else, gdy wykonujesz efekty uboczne.
Możesz łączyć operatory trójargumentowe w łańcuch, ale czytelność leci wtedy na łeb na szyję:
// Nie rób tak:
const grade = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : "F";
Jeśli zaczynasz je łączyć, wróć do else if.
Zagnieżdżony if kontra płaskie else if
Czasem jeden warunek ma sens tylko wewnątrz innego. Zagnieżdżenie jest wtedy w porządku:
Ale zagnieżdżenie na trzy lub cztery poziomy to sygnał, że z kodem coś jest nie tak. Spłaszcz go wczesnymi returnami albo połączonym warunkiem:
Wczesne returny sprawiają, że każda gałąź jest krótka i na tym samym poziomie wcięcia. Dużo łatwiej to przejrzeć niż piramidę zagnieżdżonych ifów.
Częsta pułapka: przypisanie w if
= przypisuje. === porównuje. Pomylenie ich w warunku to klasyczny błąd:
status = "done" przypisuje "done" do status i daje wartość "done", która jest truthy. Blok wykonuje się więc zawsze, a ty po cichu nadpisujesz zmienną. Lintery to wyłapują. Tryb ścisły nie. Po prostu uważaj i używaj ===, gdy chcesz porównać.
Dalej: switch
Gdy porównujesz jedną wartość z wieloma możliwymi dopasowaniami, długi łańcuch else if zaczyna się powtarzać. Instrukcja switch w JavaScript powstała dokładnie do takich przypadków i ma własne dziwactwa związane z break i przechodzeniem do kolejnych przypadków (fall-through). O niej za chwilę.
Najczęściej zadawane pytania
Jak napisać instrukcję if/else w JavaScript?
Wpisz warunek w nawiasach po if, a potem blok w nawiasach klamrowych. Dodaj else i drugi blok jako wariant awaryjny. Przykład: if (age >= 18) { console.log('adult'); } else { console.log('minor'); }. Warunkiem może być dowolne wyrażenie, JavaScript zamienia je na wartość logiczną.
Czym różni się else if od zagnieżdżonego if w JavaScript?
else if łączy warunki w łańcuch, w którym wykonuje się tylko jedna gałąź: JavaScript sprawdza warunki po kolei i zatrzymuje się na pierwszym spełnionym. Zagnieżdżone if to jeden if wewnątrz drugiego, zwykle po to, by sprawdzić drugi warunek tylko wtedy, gdy pierwszy był spełniony. Płaskie łańcuchy else if prawie zawsze czyta się łatwiej niż głęboko zagnieżdżone ify.
Kiedy użyć operatora trójargumentowego zamiast if/else?
Użyj condition ? a : b, gdy wybierasz między dwiema wartościami w wyrażeniu: przy przypisaniu zmiennej, zwracaniu z funkcji czy budowaniu stringa. Zostań przy if/else, gdy gałęzie wykonują instrukcje z efektami ubocznymi albo gdy któraś strona jest dłuższa niż krótkie wyrażenie. Łańcuchy operatorów trójargumentowych szybko stają się nieczytelne.
Dlaczego if (0) zachowuje się inaczej niż if (false) w JavaScript?
Nie zachowuje się inaczej: oba pomijają blok. JavaScript zamienia warunek na wartość logiczną, a 0, '', null, undefined, NaN i false są falsy. Pułapka polega na tym, że wartości takie jak '0' (niepusty string) i [] (pusta tablica) są truthy, co zaskakuje osoby przychodzące z innych języków.