Další šance dokončit svůj projekt a získat ceny v hodnotě 10.000 Kč! Pokračování úspěšné letní soutěže - ITnetwork winter

Lekce 4 - Podmínky v JavaScriptu

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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, Cykly v JavaScriptu, bude řeč o cyklech v JavaScriptu.


 

Stáhnout

Staženo 443x (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?
40 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
Cvičení k 4. lekci JavaScriptu
Aktivity (15)

 

 

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

Avatar
MichiK
Člen
Avatar
MichiK:30.11.2018 20:04

Udělal jsem hodiny které vás přivítají takže pokud někdo chcete poupravit nebo využít můžete
https://pastebin.com/SpncMM3d

 
Odpovědět
30.11.2018 20:04
Avatar
Patrik Pastor:9. března 14:34

hezky den,
mam kod, ve kterem chci provest prompt metodu a zobrazit tak prompt okno, ale prohlizec mi ji nezobrazuje, nevim proc:

<DOCTYPE! html>
<html>
<head>
<meta charset='uft-8'>
</head>
<body>
<script>

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

</script>
</body>
</html>

nevite, kde by mohl byt problem?

 
Odpovědět
9. března 14:34
Avatar
Odpovídá na Patrik Pastor
Patrik Pastor:9. března 14:41

PS: napsalo mi to toto:

A window.prompt() dialog generated by this page was suppressed because this page is not the active tab of the front window. Please make sure your dialogs are triggered by user interactions to avoid this situation.

 
Odpovědět
9. března 14:41
Avatar
Jakub A. Štigler:30. března 15:51

Dobrý den,
Když programspustím vyskočí mi jen první okno a na stránce se vypíše číslo, pak už se nic neděje

let numberOne = window.prompt("Write here first number", 0);
document.write(numberOne);
let operator = window.promt("Write here opearator\n(+,-,*,/)", "+");
document.write(" " + operator + " ");
let numberTwo = window.promt("Write here second number", 0);
document.write(numberTwo);
let result;
if (isNoN(numberOne) && isNoN(numberTwo))
    result = "one of numbers is not a number";
else
{
    switch (operator)
    {
        case "+":
            result = numberOne + numberTwo;
            break;
        case "-":
            result = numberOne - numberTwo;
            break;
        case ("*" || "/"):
            result = (operator == "*") ? (numberOne * numberTwo) : (numberOne / numberTwo);
            break;
        default:
            result = "wrong operator";
            break;
    }
}
document.write(" = " + result);
 
Odpovědět
30. března 15:51
Avatar
Odpovídá na Jakub A. Štigler
Tomáš Novotný:30. března 15:54

Ahoj, chybí ti tam "p" v prompt...

let numberOne = window.prompt("Write here first number", 0);
let operator = window.promt("Write here opearator\n(+,-,*,/)", "+");
Odpovědět
30. března 15:54
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Petr Kalich
Člen
Avatar
Petr Kalich:17. září 14:27

Ahoj, chtěl bych se zeptat proč je někdy používáno samostatně "if" a "else" a jindy dohromady "else if" jaký je hlavní rozdíl...díky moc, když použiju samostatně "if" v příkladu:

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");

tak se mi propojí "dobré poledne" třeba , s "dobrou noc"

 
Odpovědět
17. září 14:27
Avatar
Odpovídá na Petr Kalich
Jakub Podskalský:17. září 16:53

"if else" podmínky mají vlastnost, že proběhnou pouze pokud se nesplní podmínka "if" nebo další if else(s) nad ní.
"else" dělá v podstatě to samé, akorát u něho není podmínka a proběhne v každém případě, jestliže předešlé podmínky byly všechny false. Proto ho dáváš až nakonec a jednou.

Kdybys to udělal vše pomocí if, tak se bude pokračovat na další i přes to, že už jedna podmínka vyšla. Což asi není to, co budeš vždycky chtít :)

 
Odpovědět
17. září 16:53
Avatar
Petr Kalich
Člen
Avatar
Odpovídá na Jakub Podskalský
Petr Kalich:18. září 1:14

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

 
Odpovědět
18. září 1:14
Avatar
Víťa Š.
Člen
Avatar
Víťa Š.:9. října 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. října 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. října 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. října 19:01
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 32. Zobrazit vše