Menu

Switch w JavaScript: case, break i fallthrough

Jak działa instrukcja switch w JavaScript: case, break, default, fallthrough i kiedy switch sprawdza się lepiej niż łańcuch if/else.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Switch wybiera jedną gałąź z wielu

switch to instrukcja sterująca na sytuacje, gdy porównujesz jedną wartość z kilkoma znanymi opcjami. Łańcuch if/else if/else zrobi to samo, ale gdy sprawdzasz tę samą zmienną trzy albo cztery razy z rzędu, switch czyta się lepiej.

Podstawowa postać:

Czytając od góry: JavaScript oblicza day, porównuje wynik z każdą etykietą case i wykonuje pasujący blok. default łapie wszystko, co nie pasowało, jak końcowe else. Kolejność czytania to wartość → case → kod.

Jak naprawdę działa dopasowanie

switch porównuje za pomocą ścisłej równości, czyli operatora ===. Bez konwersji typów, bez przybliżonych dopasowań. case 1: dopasuje liczbę 1, ale nie string "1".

Pasuje tylko drugi przypadek. Jeśli kiedyś zdziwi cię, że switch nie reaguje, winowajcą zwykle jest niezgodność stringa i liczby, pochodząca z pola formularza albo parametru URL.

break zatrzymuje przepływ

Tu wiele osób się potyka. Etykieta case to cel skoku, a nie samodzielny blok. Gdy wykonanie trafi na pasujący przypadek, leci dalej linia po linii, prosto przez etykietę następnego przypadku, aż natrafi na break, return albo koniec switch.

Zobacz, co się dzieje bez break:

Pasuje "editor", ale i tak dostajesz może edytować, może przeglądać i zalogowany. To fallthrough: wykonanie przeleciało przez każdy kolejny przypadek, bo nic nie kazało mu się zatrzymać.

Dodaj break i wszystko działa jak trzeba:

Nawyk: każdy przypadek kończy się break, chyba że świadomie chcesz fallthrough.

Celowy fallthrough do grupowania

Fallthrough nie zawsze jest pomyłką. Pominięcie break to czysty sposób, by powiedzieć "wszystkie te przypadki robią to samo":

Ułożone jedna pod drugą puste etykiety case dzielą blok znajdujący się pod nimi. Zauważ, że po return nie trzeba break: funkcja kończy się całkowicie. return wewnątrz switch pomija wszystko, co nastąpiłoby dalej.

Gdy naprawdę chcesz fallthrough między niepustymi przypadkami, zostaw komentarz, żeby następna osoba czytająca kod go nie "naprawiła":

default nie musi być na końcu

Zwyczajowo default stoi na dole i tam spodziewa się go większość czytelników. Technicznie to jednak zwykła etykieta: pasuje, gdy nie pasował żaden case, niezależnie od tego, gdzie stoi. Jeśli wstawisz default w środek bez break, wykonanie przejdzie do tego, co jest pod nim. Umieść go na końcu, zakończ break (albo nie, bo nic dalej nie ma), a twoje przyszłe ja ci podziękuje.

Zasięg zmiennych wewnątrz case

Przypadki dzielą jeden zasięg blokowy: cały switch. Zadeklarowanie let albo const o tej samej nazwie w dwóch przypadkach rzuca błąd ponownej deklaracji:

switch (x) {
    case 1:
        let msg = "one";
        break;
    case 2:
        let msg = "two";   // SyntaxError: Identifier 'msg' has already been declared
        break;
}

Rozwiązanie to osobny blok dla każdego przypadku: otocz ciało nawiasami { }:

Teraz każde msg żyje we własnym zasięgu i konflikt znika. Warto o tym pamiętać zawsze, gdy case potrzebuje więcej niż jednej czy dwóch linii logiki.

switch a if/else

switch błyszczy, gdy sprawdzasz jedną wartość względem wielu stałych opcji: kodów HTTP, typów akcji Reduxa, nazw poleceń, stringów działających jak enum. Wartość pojawia się raz na górze, a wzrok czytelnika przebiega po etykietach case jak po spisie treści.

if/else jest lepsze, gdy:

  • Porównujesz przedziały (score >= 90, score >= 75).
  • Warunki dotyczą różnych zmiennych albo wyrażeń logicznych.
  • Chcesz luźnej równości albo własnych porównań (switch zawsze używa ===).

Popularną nowoczesną alternatywą dla pierwszego wzorca jest obiekt jako tablica wyszukiwania:

Trzy linie zamiast dziewięcioliniowego switch. Gdy przypadki to czyste mapowania danych bez prawdziwej logiki, obiekt (albo Map) zwykle czyta się lepiej. Po switch sięgaj wtedy, gdy każdy przypadek wykonuje prawdziwą pracę.

Dalej: pętle for

switch obsługuje jedną decyzję spośród wielu opcji. Kolejny element sterowania przepływem to powtarzanie: wykonywanie tego samego bloku kodu raz po raz. Do tego służą pętle for, które poznasz w następnej części.

Najczęściej zadawane pytania

Jak działa instrukcja switch w JavaScript?

switch porównuje jedną wartość z serią etykiet case, używając ścisłej równości (===). Gdy znajdzie dopasowanie, wykonuje kod tego przypadku i działa dalej, aż trafi na break albo koniec bloku. Opcjonalna klauzula default wykonuje się, gdy żaden case nie pasuje.

Czym jest fallthrough w switch w JavaScript?

Jeśli case nie kończy się break (ani return), wykonanie przechodzi dalej do kodu następnego przypadku, choć jego etykieta nie pasowała. Czasem przydaje się to do grupowania przypadków o wspólnej logice, ale częściej jest to błąd. Zawsze kończ przypadki break, chyba że celowo chcesz fallthrough.

Kiedy użyć switch zamiast if/else w JavaScript?

Użyj switch, gdy porównujesz jedną wartość z wieloma stałymi opcjami: kodami statusu HTTP, typami akcji, poleceniami w postaci stringów. Użyj if/else, gdy potrzebujesz przedziałów, kilku zmiennych albo wyrażeń logicznych. Pamiętaj, że switch używa ścisłej równości, więc case '1' nie dopasuje liczby 1.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ