Python týden Jarní BF
100% homeoffice, 100% časově flexibilní fulltime programátor pro ITnetwork.cz. #bezdeadlinu Mám zájem!
Využij Jarní akci a získej od nás 50 % bodů navíc zdarma! Zároveň také probíhá Python týden se slevou na e-learning až 80 %

Lekce 4 - Podmínky v JavaScriptu

V minulé lekci, Základní datové typy v JavaScriptu a jejich funkce, byla řeč o datových typech a jejich funkcích. Dnes se v JavaScript tutoriálu budeme věnovat podmínkám.

Abychom si něco naprogramovali, potřebujeme nějak reagovat na vstupy. Ty mohou být buď od uživatele nebo od systému a podle nich budeme měnit průběh programu. Říká se tomu větvení a používají se k tomu podmínky. V JavaScriptu se podmínky píší úplně stejně, jako ve všech CLike jazycích, pro začátečníky samozřejmě vysvětlím. Pokročilejší se dnes asi budou ze začátku nudit, ale věřím, že ke konci to začne být zajímavé i pro ně :)

Následující kód vypíše text "Je po šesté hodině", pokud je 18:00 a více. Bude fungovat až do půlnoci, kdy se hodiny dostanou na 0 a to začne být menší než 18.

let d = new Date();
if (d.getHours() >= 18) {
    document.write("Je po šesté hodině.");
}

Podmínka začíná příkazem if, samotný výraz v podmínce píšeme do závorky a tak, jak jsme zvyklí z matematiky. Je tu však menší změna v zápisu (syntaxi) operátorů, viz tabulka níže. Pokud výraz platí, spustí se první příkaz za podmínkou. Pokud ne, příkaz se přeskočí a program pokračuje dále až pod ním. Pokud potřebujeme spustit více příkazů, píšeme je do složených závorek. Kvůli přehlednosti se někdy do závorek píše i jen jeden příkaz, víz příklad výše.

Operátory

Ve výrazech můžeme využívat následujících operátorů:

Operátor C-like Zápis
Rovnost hodnotou ==
Rovnost hodnotou i typem ===
Je ostře větší >
Je ostře menší <
Je větší nebo rovno >=
Je menší nebo rovno <=
Nerovnost hodnotou !=
Nerovnost hodnotou i typem !==
Obecná negace !

Rovnost zapisujeme dvěma == proto, aby se to nepletlo s běžným přiřazením do proměnné, které se dělá jen jedním =. Pokud chceme nějaký výraz znegovat, napíšeme ho do závorky a před něj vykřičník.

Striktní operátory

Jistě vás zaujaly operátory pro rovnost a nerovnost hodnotou i typem. Někdy se totiž potřebujeme zeptat, zda je v proměnné např. opravdu číslo 10 a ne text "10". Klasická dvě rovná se (==) berou tyto 2 hodnoty jako shodné. Naopak operátor === je vyhodnotí jako různé. Zkusme si to:

if (10 == "10")
    document.write('10 == "10" platí');
if (10 === "10")
    document.write('10 === "10" platí');

Výsledek:

Your page
localhost

S porovnáváním různých datových typů je v JavaScriptu spojeno spoustu dalších úskalí, ale s tím si teď nebudeme lámat hlavu.

Skládání podmínek

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Nyní si zkusme udělat něco lepšího, co již reálně k něčemu bude. Zatím neumíme zpracovávat moc vstupů, zůstaňme tedy u času. Napíšeme si skript na rozpoznání dne a noci. To se může hodit pro pozdrav na webu ("Dobrý večer"/"Dobrý den") nebo dokonce pro přepínání skinu webu na denní/noční.

let d = new Date();
if ((d.getHours() > 5) && (d.getHours() < 18))
    document.write("Dobrý den");
else
    document.write("Dobrý večer");

Jistě i říkáte, co jsou to ty 2 ampersandy (&&), uveďme si proto ještě jednu tabulku operátorů pro skládání podmínek:

Operátor C-like Zápis
A zároveň &&
Nebo ||

S tím si zatím vystačíme, operátory se pomocí závorek samozřejmě dají kombinovat. Kód výše tedy vypíše "Dobrý den" pokud je aktuální hodina větší než 5 ráno a zároveň menší než 18 (6 večer).

Pozdrav v JavaScriptu
localhost

Novinkou oproti minule je příkaz else, který vykoná následující příkaz v případě, že podmínka neplatila. To se jistě hodí, jinak bychom museli psát tu samou podmínku opačně i pro noc.

Příkaz else se také využívá v případě, kdy potřebujeme manipulovat s proměnnou z podmínky a nemůžeme se na ni tedy ptát potom znovu. Program si sám pamatuje, že se podmínka nesplnila a přejde do větve else. Ukažme si to na příkladu: Mějme číslo a, kde bude hodnota 0 nebo 1 a po nás se bude chtít, abychom hodnotu prohodili (pokud tam je 0, dáme tam 1, pokud 1, dáme tam 0). Naivně bychom mohli kód napsat takto:

let a = 0; // do a si přiřadíme na začátku 0

if (a == 0) // pokud je a 0, dáme do něj jedničku
    a = 1;
if (a == 1) // pokud je a 1, dáme do něj nulu
    a = 0;

document.write(a);

Nefunguje to, že? Pojďme si projet, co bude program dělat. Na začátku máme v a nulu, první podmínka se jistě splní a dosadí do a jedničku. No ale rázem se splní i ta druhá. Co s tím? Když podmínky otočíme, budeme mít ten samý problém s jedničkou. Jak z toho ven? Ano, použijeme else.

let a = 0; // do a si přiřadíme na začátku 0

if (a == 0) // pokud je a 0, dáme do něj jedničku
    a = 1;
else // pokud je a 1, dáme do něj nulu
    a = 0;

document.write(a);

Zkusme si s podmínkami pohrát tak, aby skript uměl pozdravit návštěvníka stránek podle denní doby, tedy "Dobré ráno", "Dobré dopoledne", "Dobré poledne", "Dobré odpoledne", "Dobrý večer"... Jistě to zvládnete, stačí vložit více podmínek za sebe a vhodně nastavit časy. Nesmíte zapomenout na použití operátorů s rovná se (tedy >=, <=). Pro ty, kteří stejně potřebují popostrčit, dám malou nápovědu, jak za sebe podmínky spojovat:

let d = new Date();
if ((d.getHours() >= 5) && (d.getHours() <= 9))
    document.write("Dobré ráno");
else if ((d.getHours() >= 10) && (d.getHours() <= 11))
    document.write("Dobré dopoledne");
else if ((d.getHours() == 12))
    document.write("Dobré poledne");
else if ((d.getHours() >= 13) && (d.getHours() <= 17))
    document.write("Dobré odpoledne");
else if ((d.getHours() >= 18 && (d.getHours() <= 21)))
    document.write("Dobrý večer");
else
    document.write("Dobrou noc");

Všimněte si, že u posledního else již není žádný if. Jakmile se program dostane až sem, nezbývá jiná možnost, než že je noc a je zbytečné to ověřovat.

switch

Pokud reagujeme na různé hodnoty jedné proměnné, můžeme místo sekvence if-else if použít konstrukci switch. Teoreticky může někdy kód zpřehlednit, i když bychom se podobnému větvení měli spíše vyhýbat a snažit se ho řešit např. pomocí polí (viz dále v JavaScript kurzu).

let hodnota = 2;
let slovy;
switch (hodnota) {
    case 1:
        slovy = "jedna";
        break;
    case 2:
        slovy = "dva";
        break;
    case 3:
        slovy = "tři";
        break;
    default:
        slovy = "nevím";
}
document.write(slovy);

Syntaxe vychází z céčka a příkazy jednotlivých větví se nepíší do složených závorek, ale oddělují příkazem break, což je poměrně nepřirozené a dá se na něj lehce zapomenout. Pokud se nevykoná ani jeden případ, spustí se větev default:, což je období posledního else. Každý switch lze zapsat pomocí sekvence if-else if a kromě jiného zápisu nám nepřináší žádnou výhodu, zmiňuji ho jen kdybyste ho někde viděli nebo se vám nějak extra zalíbil.

Boolean

S podmínkami úzce souvisí datový typ boolean, který v sobě dokáže uchovávat pouze 2 hodnoty - true (pravda) nebo false (nepravda). Vytvořme si nějakou takovou proměnnou:

let mameRohliky = false;
let mameChleba = true;

Na hodnotu true/false se ve finále převede jakákoli podmínka, můžeme tedy do proměnné uložit její výslednou hodnotu:

let vek = 26;
let zletily = (vek >= 18);
document.write(zletily);

Pokud proměnnou typu boolean použijeme dále v podmínce, je již zbytečné ptát se zda se hodnota rovná true:

if (zletily == true)
// ...

a místo toho se můžeme ptát jen na proměnnou, jelikož konstrukce if očekává logický výraz, který nabývá hodnoty true nebo false:

if (zletily)
// ...

prompt()

Protože nyní umíte podmínky, jistě by bylo příjemné vyzkoušet si reagovat na co nejvíce vstupů. Bohužel zatím známe pouze datum a čas a na načítání textu z formulářů ještě nejsme dost zkušení.

JavaScript nám ovšem poskytuje funkci prompt(), která vyvolá zobrazení dialogu k zadání textu. Funkce bere 2 vstupní parametry, prvním je otázka, která se uživateli položí a druhým parametrem je výchozí text, který je v poli zadaný. Druhý parametr můžeme vynechat. Zkusme si napsat aplikaci, která zjistí zda je uživatel plnoletý:

let vek = prompt("Zadej svůj věk");
if (vek >= 18)
    document.write("Jsi plnoletý");
else
    document.write("Nejsi plnoletý");

Výsledek:

Prompt dialog v JavaScriptu
Plnoletost v JavaScriptu
localhost

K podmínkám se v našem kurzu ještě jednou vrátíme a představíme si několik dalších konstrukcí. Nyní myslím, že základ podmínek již umíme a odnesli jsme si užitečný script pro pozdravení návštěvníků :) Navíc umíte používat prompt() a můžete tak psát aplikace, které komunikují s uživatelem. V příští lekci, Řešené úlohy k 4. lekci JavaScriptu, bude řeč o cyklech v JavaScriptu.

V následujícím cvičení Řešené úlohy k 4. lekci JavaScriptu si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Stáhnout

Staženo 475x (2.7 kB)
Aplikace je včetně zdrojových kódů v jazyce JavaScript

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
42 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Předchozí článek
Základní datové typy v JavaScriptu a jejich funkce
Všechny články v sekci
Základní konstrukce jazyka JavaScript
Miniatura
Následující článek
Řešené úlohy k 4. lekci JavaScriptu
Aktivity (17)

 

 

Komentáře
Zobrazit starší komentáře (29)

Avatar
Petr Kalich
Člen
Avatar
Petr Kalich:18.9.2019 1:14

aháá..tak už je mi to jasnější, děkuji:)

 
Odpovědět
18.9.2019 1:14
Avatar
Víťa Š.
Člen
Avatar
Víťa Š.:9.10.2019 23:44

Jak přidat k hodinám i minuty? Zkoušel jsem tohle a někde mám chybu :-(

else if
((d.getHours() > 22) && (d.getHours() <= 23))
document.write("VEČERKA, je 22- 23 h.");
else if
 (((d.getHours() > 23 + (d.getMinutes() >=0)) && ((d.getHours() <= 00 + (d.getMinutes() >0)))))
 document.write("Je 23 - 00 h.");
Odpovědět
9.10.2019 23:44
Život by byl mnohem snazší, kdybychom k němu měli zdrojový kód.
Avatar
Odpovídá na Víťa Š.
Jakub Podskalský:10.10.2019 19:01

Zkus zaměnit to + za další && operátor. Když to totiž sčítáš, tak oba dva sčítance se poté pokusí vyhodnotit na Boolean, True nebo False. True se rovná 1 a False 0. Takže se tyto dvě hodnoty (oba dva sčítance) sečtou, a pokud to bude > 0, tak se ta strana vyhodnotí jako True a porovná se pomocí && s tou stranou druhou (kde se zas děje to samé). Jelikož tam máš na obou stranách d.getMinutes() >= 0, tak to bude vždycky True (1), protože minuty jsou v JavaScriptu 0-59 a to je určitě větší nebo rovno nule.
Když 1 sečteš s druhým sčítancem, tak to bude bude vždycky 1 nebo 2, a to je True. Takže True && True se rovná True. A na obou stranách máš ty fixně pravdivé minuty, takže se tento else if blok rozjede pokaždé, jestliže se k němu dojde.

Píšu z mobilu, takže promiň, jestli je to trochu nešťastně popsané. Kdyžtak řekni a pokusím se to vysvětlit líp. :)

 
Odpovědět
10.10.2019 19:01
Avatar
David P.
Člen
Avatar
David P.:30.12.2019 14:56

Dobrý den,
dokáže mi někdo poradit, kde mám chybu? Při spuštění v prohlížeči se nezobrazí vůbec nic.
Děkuji moc.

<!DOCTYPE html>

<html lang="cs-cz">
    <head>
        <meta charset="utf-8" />
        <title>Burza králíků</title>
    </head>

    <body>
        <script type="text/javascript">
            document.write("Ahoj!");
            document.write("Zde můžete prodat své králíky.");
            let kralici = prompt("Kolik králíků chcete prodat?");
            if (kralici>10)
                document.write("Máte jich moc!");
            else if (kralici<10) && (kralici>4)
                document.write("V pořádku, máte jich akorát.");
            else if (kralici<5)
                document.write("Máte jich málo!");
            else
                document.write("Chybná volba! Odejděte prosím!");
        </script>
    </body>
</html>
 
Odpovědět
30.12.2019 14:56
Avatar
Jurajs
Člen
Avatar
Odpovídá na David P.
Jurajs:30.12.2019 16:06

Ahoj posílám opravený kód :D

document.write("Ahoj!");
    document.write("Zde můžete prodat své králíky.");
    let kralici = prompt("Kolik králíků chcete prodat?");
    if (kralici>10)
        document.write("Máte jich moc!");
    else if (kralici<10 && kralici>4) // Zde byla chyba závorky! :)
        document.write("V pořádku, máte jich akorát.");
    else if (kralici<5)
        document.write("Máte jich málo!");
    else
        document.write("Chybná volba! Odejděte prosím!");
 
Odpovědět
30.12.2019 16:06
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jurajs
Člen
Avatar
Odpovídá na David P.
Jurajs:30.12.2019 16:10

Ještě jedna věc používej F12(console), tam ti píše, kde a co máš za chybu...

 
Odpovědět
30.12.2019 16:10
Avatar
David P.
Člen
Avatar
Odpovídá na Jurajs
David P.:30.12.2019 16:12

Dobře, budu se toho držet.
Děkuji moc za rady.

 
Odpovědět
30.12.2019 16:12
Avatar
David P.
Člen
Avatar
Odpovídá na Jurajs
David P.:2. ledna 18:07

Ahoj,
mám ještě problém. Ten opravený kód, který jsi poslal, fungoval a nyní již nefunguje. Vůbec to nechápu...
Děkuji moc a chápu, jestli tě naštvalo...

<!DOCTYPE html>

<html lang="cs-cz">
    <head>
        <meta charset="utf-8" />
        <title>Burza králíků</title>
    </head>

    <body>
        <script type="text/javascript">
            document.write("Ahoj!");
            document.write("Zde můžete prodat své králíky.");
            let kralici = prompt("Kolik králíků chcete prodat?");
            if (kralici=>10)
                document.write("Máte jich moc!");
            else if (kralici<10 && kralici>4)
                document.write("V pořádku, máte jich akorát.");
            else if (kralici<5)
                document.write("Máte jich málo!");
            else
                document.write("Chybná volba! Odejděte prosím!");
        </script>
    </body>
</html>
 
Odpovědět
2. ledna 18:07
Avatar
Odpovídá na David P.
Reaktivní uživatel:2. ledna 18:21

Větší nebo rovno (a menší nebo rovno) se zapisuje ve stejném pořadí, v jakém to říkáš. Tak, jak jsi to napsal, to má úplně jinou funkci.

Odpovědět
2. ledna 18:21
Kdo je připraven, toho zaskočí něco jiného
Avatar
David P.
Člen
Avatar
Odpovídá na Reaktivní uživatel
David P.:2. ledna 18:41

To by mě zaboha nenapadlo, ale funguje to.
Děkuji mnohokrát.

 
Odpovědět
2. ledna 18:41
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 39. Zobrazit vše