Front-end Front-end
Probíhá výprodej HTML, JavaScript a Bootstrap. Slevy až 80 %
Vyšlehej si extra vědomosti! Až 100% bodů na prémiový obsah zdarma! Více zde

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 ==
Je ostře větší >
Je ostře menší <
Je větší nebo rovno >=
Je menší nebo rovno <=
Nerovnost !=
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.

Skládání podmínek

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)
// ...

Ternární operátor

Často se nám stává, že někde potřebujeme různé hodnoty podle toho, zda platí nějaká podmínka. Představme si, že máme např. pohlaví uživatele uložené jako Boolean (muž by byl true) a my bychom ho chtěli převést do textu. S dosavadními znalostmi bychom napsali asi takovýto kód:

let muz = true; // nějaká proměnná udávající pohlaví
let nazevPohlavi;
if (muz)
        nazevPohlavi = "muž";
else
        nazevPohlavi = "žena";
document.write(nazevPohlavi);

Získat hodnotu podle platnosti logického výrazu můžeme s využitím tzv. ternárního výrazu:

let muz = true; // nějaká proměnná udávající pohlaví
let nazevPohlavi = (muz) ? "muž" : "žena";
document.write(nazevPohlavi);

Podmínku vložíme většinou do závorky, poté následuje otazník a 2 hodnoty, které se mají vrátit. Hodnoty jsou oddělené dvojtečkou, první se vrátí když podmínka platí a druhá když neplatí. Místo Booleanu bychom mohli do závorky samozřejmě napsat jakoukoli jinou podmínku, např. (vek >= 18) ? "zletilý" : "nezletilý".

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");
document.write((vek >= 18) ? "Jsi plnoletý" : "Nejsi plnoletý");

Výsledek:

Prompt dialog v JavaScriptu
Plnoletost v JavaScriptu
localhost

Myslím, že podmínky 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 384x (2.52 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?
33 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 (8)

 

 

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

Avatar
Cyborg
Člen
Avatar
Cyborg:27.2.2016 11:58

Čau, v první řadě není za co děkovat :) Rád jsem pomohl :) Za druhé nechápu, jak se mi tam dostalo to

var d = new Date();

Díval jsem se do zdrojáku a mám tam

var j = new Date();

Docela záhada no :D

 
Odpovědět 27.2.2016 11:58
Avatar
Eliška Zlatohlávková:31.1.2018 17:23

Fungovalo mi to hned napoprvé :-), dobře jsi to vysvětlil, díky

 
Odpovědět 31.1.2018 17:23
Avatar
Jaroslav Patrný:11.7.2018 22:38

Jen takovou prkotinu k ročním obdobím: Všude by mělo u měsíců být <=20, jen u září <=22. Kalendářní podzim začíná 23., ostatní roční období 21.

 
Odpovědět 11.7.2018 22:38
Avatar
Onderjepán
Člen
Avatar
Onderjepán:28.9.2018 21:21

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

Dotaz,
Proč máš za 21 ))) a zároveň nemáš za 18 žádnou?

 
Odpovědět 28.9.2018 21:21
Avatar
Adam Bíba
Člen
Avatar
Odpovídá na Onderjepán
Adam Bíba:5.11.2018 17:30

To bude určitě překlep, správně má být:

else if ((d.getHours() >= 18) && (d.getHours() <= 21))
 
Odpovědět 5.11.2018 17:30
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
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 27. Zobrazit vše