22. diel - Podmienky v JavaScripte po tretie
V minulej lekcii, Striktné operátory a pretypovanie v JavaScripte, sme sa podrobne venovali pretypovaniu v JavaScripte, naučili sa skrátený zápis podmienok a vieme sa vyhnúť mnohým úskaliam pomocou striktných operátorov.
V dnešnom tutoriále základov JavaScriptu si predstavíme
ďalšie dve konštrukcie, ktoré súvisia s podmienkami.
Jedná sa o ternárny operátor a konštrukciu
switch
s prepadávaním.
Ternárny operátor
Často sa nám stáva, že niekde potrebujeme nastaviť iba dve rôzne hodnoty podľa toho, či platí nejaká podmienka.
Výpis pohlavia pomocou podmienky
Predstavme si, že máme napríklad pohlavie používateľa uložené ako
boolean
(muž by bol true
) a my by sme ho chceli
previesť do textu. S doterajšími znalosťami by sme napísali asi takýto
kód:
let man = true; // variable indicating a gender let gender; if (man) gender = 'man'; else gender = 'woman'; document.write(gender);
Výstup programu je samozrejme nasledujúci:
Kód je pomerne dlhý na to, že len prepína medzi dvoma hodnotami. Preto programovacie jazyky často podporujú tzv. ternárny výraz.
Syntax ternárneho výrazu
Získať hodnotu podľa platnosti logického výrazu môžeme s využitím tzv. ternárneho výrazu. Jeho syntax je nasledovná:
(condition) ? fulfilled : unfulfilled
Podmienku vložíme väčšinou do zátvorky ()
, potom nasleduje
otáznik ?
a dve hodnoty, ktoré sa majú vrátiť. Hodnoty sú
oddelené dvojbodkou :
. Prvá hodnota true
sa vráti,
keď podmienka platí. Druhá hodnota false
, keď podmienka
neplatí. Aké jednoduché!
Názov operátora je odvodený od toho, že má tri časti (podmienka, prvá
hodnota a druhá hodnota), preto ternárny.
Výpis pohlavia pomocou ternárneho výrazu
Poďme si ternárny operátor vyskúšať na príklade s pohlavím:
let man = true; // variable indicating a gender let gender = (man) ? 'man' : 'woman'; document.write(gender);
V prehliadači získame rovnaký výstup ako pri príklade vyššie:
Namiesto premennej typu boolean
by sme mohli do
zátvorky samozrejme napísať akúkoľvek inú podmienku, napríklad
(age >= 18) ? 'of legal age' : 'a minor'
. V
prípade jednoduchých výrazov môžeme zátvorku aj vynechať.
Vnorenie ternárnych operátorov
Ternárne operátory je možné teoreticky zanárať do seba a tým reagovať aj na tri a viac hodnôt. Avšak vo väčšine prípadov zanáranie skôr kód zneprehľadní, vznikajú totiž dlhé alebo podivne zalomené riadky a nie je na prvý pohľad vidieť, aká časť sa kedy spustí. Ukážme si, ako by sa pomocou vnorovania ternárnych výrazov vyriešil výpis troch smajlíkov:
let smiley = ":("; // variable indicating a smiley face let mood = (smiley === ":)") ? "happy" : (smiley === ":(") ? "sad" : "unknown"; document.write(mood);
Výstup:
Prepínanie hodnoty
boolean
premennej
Ukážme si posledný príklad. V lekcii Podmienky
v JavaScripte sme si ukazovali, ako skrátiť kód pre zmenu
boolean
hodnoty. Výsledkom bol zápis:
let lightShines = false; lightShines = !lightShines; // we switch the state of the light if (lightShines) { document.write("The light was off, now we turned it on."); } else { document.write("The light was on, now we turned it off."); }
Ternárny operátor nám umožňuje existujúci kód ešte skrátiť:
let lightShines = false; lightShines = !lightShines ; document.write(lightShines ? "The light was off, we turned it on." : "The light was on, we turned it off.");
Konštrukcia switch
s
prepadávaním
S konštrukciou switch
sme sa už stretli. Tu si ukážeme jej
ďalšie použitie. Na rozdiel od ternárneho operátora ide ale skôr o
historickú funkčnosť, pre ktorú dnes nie je veľa rozumného využitia.
Stále je ale súčasťou JavaScriptu a môžeme na ňu naraziť v cudzích
zdrojových kódoch.
Výpis štvrťroku
Predpokladajme, že chceme podľa mesiaca v roku zistiť, aký je štvrťrok.
Pomocou if
a else
by príklad vyzeral nasledovne:
let month = 11; if (month >= 1 && month <= 3) document.write('It is the first quarter.'); else if (month >= 4 && month <= 6) document.write('It is the second quarter.'); else if (month >= 7 && month <= 9) document.write('It is the third quarter.'); else if (month >= 10 && month <= 12) document. Write('It is the fourth quarter.');
Ako ale použiť switch
pre tento príklad? Mohlo by nám
napadnúť nasledovné riešenie:
let month = 11; switch (month) { case 1: document.write('It is the first quarter.'); break; case 2: document.write('It is the first quarter.'); break; case 3: document.write('It is the first quarter.'); break; case 4: document.write('It is the second quarter.'); break; case 5: document.write('It is the second quarter.'); break; case 6: document.write('It is the second quarter.'); break; case 7: document.write('It is the third quarter.'); break; case 8: document.write('It is the third quarter.'); break; case 9: document.write('It is the third quarter.'); break; case 10: document.write('It is the fourth quarter.'); break; case 11: document.write('It is the fourth quarter.'); break; case 12: document.write('It is the fourth quarter.'); break; }
Príklad funguje spoľahlivo, problémom však je, že sme si týmto zápisom veľmi nepomohli. Podobnému repetitívnemu kódu by sme sa vždy mali vyhýbať.
Prepadávanie
Skúsme to ešte raz a využime tzv. prepadávanie.
Ak potrebujeme vo viacerých blokoch case
vykonávať rovnaký
kód, stačí tieto bloky vložiť pod seba a neukončovať každý blok pomocou
príkazu break
, ale celú skupinu bloku jedným príkazom
break
. Neukončené bloky tak prepadnú a vykoná sa kód
spoločný pre viac blokov:
let month = 11; switch (month) { case 1: case 2: case 3: document.write('It is the first quarter.'); break; case 4: case 5: case 6: document.write('It is the second quarter.'); break; case 7: case 8: case 9: document.write('It is the third quarter.'); break; case 10: case 11: case 12: document.write('It is the fourth quarter.'); break; }
Ukážka aplikácie v prehliadači:
Tento zápis je už oveľa prehľadnejší. Konštrukcia switch
má však pridanú hodnotu skôr v prípade, keď nemôžeme hodnoty porovnať v
podmienke pomocou operátora väčší alebo menší a ide o zoznam
hodnôt. Tu je to skôr redundantný kód plný prázdnych
case
.
JavaScript podporuje prepadávanie ako prázdnych
case
, tak na rozdiel od iných jazykov aj case
s
ďalším kódom. To je častá príčina nechcených chýb (zabudnutých
break
), ktoré sa potom veľmi ťažko hľadajú.
Čo toto varovanie znamená si ukážeme na ďalšom príklade.
Ak sa case
vyhodnotí ako pravdivý, vykonajú sa inštrukcie
pre tento case
a potom sa pokračuje vykonávanie kódu aj
ďalších case
bez ohľadu na to, či sú splnené. Takto program
pokračuje, kým nenarazí na príkaz break
:
let grade = 1; switch (grade) { case 1: document.write("Hurray, I got an A!"); // it falls into the next case (because no break was used) case 2: document.write("B is alright."); break; case 3: document.write("C is still good."); break; // another case }
Pretože v prvom case
chýba príkaz break
, v
prehliadači sa nám vypíše aj text druhého case
:
Prepadávanie používajte v konštrukcii switch
len ak na to
máte dobrý dôvod. Dôležité je, aby ste ho vedeli čítať, keď naň
niekde narazíte.
Rovnako ako k podmienkam je v JavaScripte, pár ďalších drobností si
povieme aj k cyklom, ale o tom inokedy
V ďalšej lekcii, Cykly v JavaScripte po tretie, sa naučíme používať kľúčové slová
break
, continue
, návestia a cyklus do
-
while
.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 12x (2.31 kB)
Aplikácia je vrátane zdrojových kódov v jazyku JavaScript