Lekcja 4: Instrukcje Warunkowe

Instrukcje warunkowe pozwalają na wykonywanie różnych bloków kodu w zależności od tego, czy określone warunki są spełnione (prawdziwe) czy nie (fałszywe). Są one fundamentalnym elementem logiki w programowaniu.

Instrukcja `if`

Najprostsza instrukcja warunkowa. Wykonuje blok kodu tylko wtedy, gdy podany warunek jest prawdziwy.

if (warunek) {
    // Kod do wykonania, jeśli warunek jest prawdziwy
}
let wiek = 20;

if (wiek >= 18) {
    console.log("Jesteś pełnoletni.");
}
// Jeśli wiek < 18, nic się nie wyświetli

Instrukcja `if...else`

Pozwala na wykonanie jednego bloku kodu, gdy warunek jest prawdziwy, i innego bloku, gdy warunek jest fałszywy.

if (warunek) {
    // Kod do wykonania, jeśli warunek jest prawdziwy
} else {
    // Kod do wykonania, jeśli warunek jest fałszywy
}
let temperatura = 15;

if (temperatura > 20) {
    console.log("Jest ciepło.");
} else {
    console.log("Jest chłodno."); // Ten kod zostanie wykonany
}

Instrukcja `if...else if...else`

Umożliwia sprawdzenie wielu warunków po kolei. Wykonany zostanie blok kodu odpowiadający pierwszemu prawdziwemu warunkowi. Opcjonalny blok `else` na końcu zostanie wykonany, jeśli żaden z wcześniejszych warunków nie był prawdziwy.

if (warunek1) {
    // Kod dla warunku 1
} else if (warunek2) {
    // Kod dla warunku 2
} else if (warunek3) {
    // Kod dla warunku 3
} else {
    // Kod, jeśli żaden warunek nie jest prawdziwy (opcjonalny)
}
let ocena = 75;

if (ocena >= 90) {
    console.log("Ocena: 5");
} else if (ocena >= 75) {
    console.log("Ocena: 4"); // Ten kod zostanie wykonany
} else if (ocena >= 50) {
    console.log("Ocena: 3");
} else {
    console.log("Ocena: 2");
}

Instrukcja `switch`

Alternatywa dla długich łańcuchów `if...else if...else`, szczególnie przydatna, gdy porównujemy jedną wartość z wieloma możliwymi stałymi wartościami.

switch (wyrazenie) {
    case wartosc1:
        // Kod dla wartosc1
        break; // Ważne: przerywa wykonanie switch
    case wartosc2:
        // Kod dla wartosc2
        break;
    // ... inne przypadki
    default:
        // Kod, jeśli żadna wartość nie pasuje (opcjonalny)
}

Instrukcja switch porównuje wartość wyrazenie z wartościami podanymi w kolejnych case (używając porównania identyczności ===). Jeśli znajdzie dopasowanie, wykonuje kod od tego miejsca aż do napotkania instrukcji break lub końca switch.

Instrukcja break jest kluczowa - bez niej wykonanie "przejdzie" do następnego bloku case, co zazwyczaj nie jest pożądane.

Blok default jest opcjonalny i wykonuje się, gdy żadna z wartości case nie pasuje.

let dzienTygodnia = 3;
let nazwaDnia;

switch (dzienTygodnia) {
    case 1:
        nazwaDnia = "Poniedziałek";
        break;
    case 2:
        nazwaDnia = "Wtorek";
        break;
    case 3:
        nazwaDnia = "Środa"; // Pasuje!
        break;
    case 4:
        nazwaDnia = "Czwartek";
        break;
    case 5:
        nazwaDnia = "Piątek";
        break;
    case 6:
        nazwaDnia = "Sobota";
        break;
    case 7:
        nazwaDnia = "Niedziela";
        break;
    default:
        nazwaDnia = "Nieprawidłowy numer dnia";
}

console.log(nazwaDnia); // "Środa"

Truthy i Falsy w warunkach

Instrukcje warunkowe nie wymagają jawnych wartości true lub false. Mogą działać z dowolnymi wartościami, które są interpretowane jako "prawdziwe" (truthy) lub "fałszywe" (falsy).

Przypomnienie wartości "falsy": false, 0, -0, 0n, "", null, undefined, NaN.

Wszystkie inne wartości są "truthy".

let uzytkownik = "Jan";

if (uzytkownik) { // uzytkownik jest stringiem niepustym, więc jest "truthy"
    console.log(`Witaj, ${uzytkownik}!`); // Ten kod zostanie wykonany
} else {
    console.log("Witaj, gościu!");
}

let liczbaProduktow = 0;

if (liczbaProduktow) { // liczbaProduktow to 0, więc jest "falsy"
    console.log("Masz produkty w koszyku.");
} else {
    console.log("Twój koszyk jest pusty."); // Ten kod zostanie wykonany
}

Zadanie praktyczne

Napisz skrypt używający instrukcji if...else if...else, który sprawdza, czy podana liczba num jest dodatnia, ujemna, czy równa zero. Wyświetl odpowiedni komunikat w konsoli.

Pokaż rozwiązanie
let num = -5; // Możesz zmienić tę wartość, aby przetestować

if (num > 0) {
    console.log("Liczba jest dodatnia.");
} else if (num < 0) {
    console.log("Liczba jest ujemna.");
} else {
    console.log("Liczba jest równa zero.");
}

Zadanie do samodzielnego wykonania

Napisz skrypt używający instrukcji switch, który na podstawie zmiennej miesiac (liczba od 1 do 12) przypisze do zmiennej poraRoku odpowiednią porę roku ("Wiosna", "Lato", "Jesień", "Zima"). Przyjmij uproszczony podział: 3-5 to Wiosna, 6-8 to Lato, 9-11 to Jesień, 12, 1, 2 to Zima. Wyświetl wynik w konsoli.

FAQ - Instrukcje Warunkowe

Kiedy lepiej użyć `if...else if`, a kiedy `switch`?

switch jest zazwyczaj lepszy, gdy porównujesz jedną zmienną z wieloma konkretnymi, stałymi wartościami (liczbowymi lub stringami). if...else if jest bardziej elastyczny i lepiej nadaje się do sprawdzania złożonych warunków, zakresów wartości lub porównywania różnych zmiennych.

Co się stanie, jeśli zapomnę `break` w `switch`?

Jeśli pominiesz break, wykonanie kodu będzie kontynuowane w następnym bloku case, niezależnie od tego, czy jego warunek jest spełniony. Nazywa się to "fall-through". Czasami jest to celowe, ale najczęściej prowadzi do błędów logicznych, dlatego ważne jest, aby pamiętać o break.

Czy mogę zagnieżdżać instrukcje warunkowe?

Tak, instrukcje if, else if, else i switch można umieszczać wewnątrz innych instrukcji warunkowych. Pozwala to na tworzenie bardziej złożonej logiki, ale należy uważać, aby kod pozostał czytelny i unikać zbyt głębokiego zagnieżdżania.

Jak `switch` porównuje wartości w `case`?

Instrukcja switch używa ścisłego porównania (identyczności ===) do sprawdzania dopasowania między wyrażeniem w switch a wartościami w case. Oznacza to, że porównywane są zarówno wartości, jak i typy, bez automatycznej konwersji typów.

Czy blok `else` jest zawsze wymagany?

Nie, blok else w instrukcji if oraz blok default w instrukcji switch są opcjonalne. Używa się ich, gdy chcemy wykonać jakiś kod w sytuacji, gdy żaden z wcześniejszych warunków nie został spełniony.

Czy mogę używać operatorów logicznych w warunkach `if`?

Oczywiście. Operatory logiczne && (AND), || (OR) i ! (NOT) są często używane w warunkach if do tworzenia bardziej złożonych warunków, które łączą wiele sprawdzeń w jednym wyrażeniu logicznym.