← Lekcje
JavaScript · lekcja 08

Warunki i pętle 2/4:
switch i operator ? :

Dzisiaj:

  1. Instrukcja switch - znacie ją już z PHP
  2. Ten sam wybór jako else if i jako switch
  3. Pułapka: zapomniany break i porównanie ścisłe w case
  4. Operator ? : - skrócony if
Rozgrzewka · 3 minuty

Rozgrzewka: if, else if

  1. W funkcji getDiscount z poprzedniej lekcji rabat zależał od koloru (zielony LUB niebieski) ORAZ kwoty zakupów. Jaki operator łączył te dwa warunki?
  2. Ile bloków else if może stać między if a else?
  3. Dlaczego warunek (a || b) && c wymaga nawiasu wokół ||?
Część 1 · Instrukcja switch

switch - znacie to już z PHP

W kursie PHP, na lekcji 05, pisaliście switch w PHP. W JavaScript budowa jest taka sama: switch, w nawiasie jedna wartość, gałęzie case zakończone break, na końcu default.

switch (day) "wt" case "pn": siłownia case "wt": nauka JS ✓ case "sr": basen default: wolne console.log("nauka JS") break kończy switch
let day = "wt";
switch (day) {
  case "pn":
    console.log("siłownia");
    break;
  case "wt":
    console.log("nauka JS");
    break;
  default:
    console.log("wolne");
}

Różnica względem PHP: JavaScript porównuje wartość w case ze zmienną ściśle (jak ===) - PHP robi to luźno (jak ==). Liczba 10 i tekst "10" to dla JS switch dwie różne rzeczy.

MDN: Learn_web_development/Core/Scripting/Conditionals (sekcja „Basic switch syntax”) · MDN: Web/JavaScript/Reference/Statements/switch (opis porównania „strict equality”) · PHP Manual: control-structures.switch.php
Część 2 · switch kontra else if

Ten sam wybór: else if i switch

if (level === 1) ... else if (level === 2) ... else if (level === 3) ... drabinka sprawdzana od góry case 1: case 2: (dopasowany) case 3: jeden strzał w pasujący tor "średni"

else if

let label;
if (level === 1) {
  label = "łatwy";
} else if (level === 2) {
  label = "średni";
} else if (level === 3) {
  label = "trudny";
} else {
  label = "nieznany";
}

switch

let label;
switch (level) {
  case 1: label = "łatwy"; break;
  case 2: label = "średni"; break;
  case 3: label = "trudny"; break;
  default: label = "nieznany";
}
MDN: Conditionals (sekcja przed składnią switch: „For cases where you just want to set a variable to a certain choice of value… the syntax can be a bit cumbersome, especially if you've got a large number of choices. In such a case, switch statements are your friend”)
Część 3 · pułapka

Bez break: przeciek do sąsiada

case 1 pusto case 2 trafiony case 3 zalane default zalane brak break - płynie dalej
let n = 2;
let message = "";
switch (n) {
  case 1:
    message += "jeden ";
  case 2:
    message += "dwa ";
  case 3:
    message += "trzy ";
  default:
    message += "inne";
}
console.log(message);
// dwa trzy inne

JavaScript znajduje pasujący case 2 i od tego miejsca wykonuje wszystko w dół, aż trafi na break albo koniec bloku - nawet default. To zjawisko nazywa się „fall-through” (przeciek). Nie jest błędem składni, więc nikt Was nie ostrzeże.

MDN: Web/JavaScript/Reference/Statements/switch („If break is omitted, execution will proceed to the next case clause… This behavior is called fall-through”)
Część 4 · operator ? :

Jedna linia: warunek ? tak : nie

age >= 18 ? true "dorosły" false "niepełnoletni" jeden wynik trafia do zmiennej

if … else w czterech liniach

let label;
if (age >= 18) {
  label = "dorosły";
} else {
  label = "niepełnoletni";
}

to samo w jednej

let label = age >= 18 ? "dorosły" : "niepełnoletni";
console.log(label);

Nazwa: operator warunkowy (ternary). Czytacie: „jeśli age >= 18, to "dorosły", inaczej "niepełnoletni"”. Do jednego prostego wyboru, który od razu ma trafić do zmiennej - kilka gałęzi to wciąż switch albo if.

Ciekawostka z Wikipedii: taki operator pojawił się już w 1963 roku w języku CPL, w innym zapisie. Dzisiejszy zapis warunek ? tak : nie wprowadził język C i to on stał się wzorem dla JavaScriptu.

MDN: Learn_web_development/Core/Scripting/Conditionals (sekcja „Ternary operator”: „can take up a lot less code than an if...else block if you have two choices…”) · ciekawostka: „The construct first appeared in CPL in 1963… C introduced the syntax a ? b : c… which is widely used by other languages with C-like syntax” · en.wikipedia.org/wiki/%3F
Egzamin EE.09

Tak pytają na egzaminie

1. Dany jest kod w języku JavaScript:

var x = 10;
switch(x) { case "10": alert("Test instrukcji switch"); }

Alert nie zostanie wyświetlony, ponieważ

  1. nie zastosowano instrukcji break.
  2. nie zastosowano wyrażenia default.
  3. wartość zmiennej x nie została zdefiniowana przed instrukcją switch.
  4. w instrukcji switch w wyrażeniu case nie dostosowano zapisu wartości do typu zmiennej x.

2. Instrukcją równoważną funkcjonalnie do przedstawionej instrukcji JavaScript

switch (operation) { case 1: result = a + b; break; case 2: result = a - b; break; case 3: result = a * b; break; case 4: result = a / b; break; }

jest

  1. if(operation==1) result=a+b; else if(operation==2) result=a-b; else if(operation==3) result=a*b; else result=a/b;
  2. if(operation==1) result=a+b; else if(operation==2) result=a-b; else if(operation==3) result=a*b; else if(operation==4) result=a/b;
  3. if(operation!=1) result=a+b; if(operation!=2) result=a-b; if(operation!=3) result=a*b; if(operation!=4) result=a/b;
  4. if(operation=1) result=a+b; else if(operation=2) result=a-b; else if(operation=3) result=a*b; else if(operation=4) result=a/b;
CKE, EE.09, styczeń 2023, zadanie 11 · CKE, EE.09, czerwiec 2022, zadanie 3 (bank pytań, przedmiot strony, temat javascript)
Ćwiczenie przy komputerze · 20 minut

Ćwiczenie: kalkulator na switch

  1. W folderze swojego projektu otwórz script.js (ten sam plik co na poprzednich lekcjach).
  2. Zadeklaruj let num1, let num2 (dwie dowolne liczby) i let operation (liczba 1–4).
  3. Napisz switch (operation) z case 14 liczącym kolejno +, -, *, / na num1 i num2, wynik zapisz w let result. Każdy case kończ break.
  4. Dodaj default, który wypisuje w konsoli "Błąd: nieznane działanie".
  5. Zmień operation na 1, 2, 3, 4 i sprawdź w konsoli (F12 → Console) wszystkie cztery wyniki, potem na 9 i sprawdź komunikat błędu.
  6. Zapisz script.js, odśwież stronę i zostaw kalkulator w pliku.
Na koniec

Sprawdź się

  1. Czym różni się porównanie wartości w switch od porównania operatorem == w if?
  2. Co się stanie, gdy w bloku case zabraknie break?
  3. Kiedy sięgacie po operator ? : zamiast pełnego if...else?

Na następnej lekcji: pętle for i while w JavaScript.

Poza szkołą

A jak to wygląda w produkcji?

Na lekcjiW produkcjiStatus
switch bez defaultESLint, reguła default-case, wymusza gałąź default w każdym switch.narzędzia
case bez break (przeciek)ESLint, reguła no-fallthrough, ostrzega przy przypadkowym braku break; celowe sklejenie dwóch case wymaga komentarza w kodzie.narzędzia
Zagnieżdżony operator ? : (a ? b : c ? d : e)ESLint, reguła no-nested-ternary, zakazuje zagnieżdżania - taki kod czyta się od razu gorzej niż if.unikane
switch tylko po to, by dobrać wartość zmiennejProstą tabelę wartość→wartość częściej zapisuje się jako obiekt-mapa (const labels = {1: "łatwy", 2: "średni"}) niż switch.zastępowane
ESLint, reguła default-case (eslint.org/docs/latest/rules/default-case) · ESLint, reguła no-fallthrough (eslint.org/docs/latest/rules/no-fallthrough) · ESLint, reguła no-nested-ternary (eslint.org/docs/latest/rules/no-nested-ternary)