NÄkdy potÅebujeme provést různé akce v závislosti na platnosti různých podmÃnek.
K tomu můžeme použÃt pÅÃkaz if a podmÃnÄný operátor ?, který se také nazývá operátor âotaznÃkuâ.
PÅÃkaz âifâ
PÅÃkaz if(...) vyhodnotà podmÃnku v závorkách a je-li výsledek true, vykoná blok kódu.
PÅÃklad:
let rok = prompt('Ve kterém roce byla publikována specifikace ECMAScript-2015?', '');
if (rok == 2015) alert( 'Máte pravdu!' );
V uvedeném pÅÃkladu je podmÃnkou jednoduchý test rovnosti (rok == 2015), ale může být i mnohem složitÄjÅ¡Ã.
Jestliže chceme vykonat vÃce než jeden pÅÃkaz, musÃme náš blok kódu uzavÅÃt do složených závorek:
if (rok == 2015) {
alert( "SprávnÄ!" );
alert( "Vy jste tak chytrý!" );
}
DoporuÄujeme uzavÃrat blok kódu do složených závorek {} vždy, když použijete pÅÃkaz if, i když má vykonat pouze jeden pÅÃkaz. ZlepÅ¡uje to Äitelnost.
Konverze na boolean
PÅÃkaz if (â¦) vyhodnotà výraz v závorkách a pÅevede výsledek na typ boolean.
Zopakujme si pravidla konverze z kapitoly Typová konverze:
- ÄÃslo
0, prázdný ÅetÄzec"",null,undefinedaNaNse pÅevedou nafalse. Proto se jim také ÅÃká ânepravdivéâ hodnoty. - Ostatnà hodnoty se pÅevedou na
true, proto se jim ÅÃká âpravdivéâ.
Kód pod touto podmÃnkou se tedy nikdy nevykoná:
if (0) { // 0 je nepravdivá
...
}
â¦a pod touto podmÃnkou se naopak vykoná vždy:
if (1) { // 1 je pravdivá
...
}
Můžeme také do if pÅedat pÅedem vypoÄtenou hodnotu, napÅÃklad takto:
let podmÃnka = (rok == 2015); // rovnost se vyhodnotà jako true nebo false
if (podmÃnka) {
...
}
Klauzule âelseâ
PÅÃkaz if může obsahovat nepovinný blok else, který se vykoná, když podmÃnka je nepravdivá.
PÅÃklad:
let rok = prompt('Ve kterém roce byla publikována specifikace ECMAScript-2015?', '');
if (rok == 2015) {
alert( 'Uhádli jste!' );
} else {
alert( 'Jak se můžete takhle zmýlit?' ); // jakákoli jiná hodnota než 2015
}
VÃce podmÃnek za sebou: âelse ifâ
NÄkdy bychom chtÄli otestovat nÄkolik variant podmÃnky. To nám umožnà klauzule else if.
PÅÃklad:
let rok = prompt('Ve kterém roce byla publikována specifikace ECMAScript-2015?', '');
if (rok < 2015) {
alert( 'PÅÃliÅ¡ brzy...' );
} else if (rok > 2015) {
alert( 'PÅÃliÅ¡ pozdÄ...' );
} else {
alert( 'SprávnÄ!' );
}
Ve výše uvedeném kódu JavaScript napÅed ovÄÅà podmÃnku rok < 2015. NenÃ-li splnÄna, pokraÄuje k dalšà podmÃnce rok > 2015. NenÃ-li splnÄna ani ta, zobrazà se poslednà alert.
Bloků else if může být vÃce. ZávÄreÄné else nenà povinné.
PodmÃnÄný operátor â?â
NÄkdy potÅebujeme pÅiÅadit do promÄnné hodnotu v závislosti na výsledku podmÃnky.
PÅÃklad:
let pÅÃstupPovolen;
let vÄk = prompt('Kolik je vám let?', '');
if (vÄk > 18) {
pÅÃstupPovolen = true;
} else {
pÅÃstupPovolen = false;
}
alert(pÅÃstupPovolen);
Provést to kratÅ¡Ãm a jednoduššÃm způsobem nám umožnà tzv. âpodmÃnÄnýâ operátor neboli operátor âotaznÃkuâ.
Tento operátor je reprezentován otaznÃkem ?. NÄkdy se nazývá âternárnÃâ, protože má tÅi operandy. Je to v souÄasnosti jediný operátor v JavaScriptu, který jich má tolik.
Jeho syntaxe je:
let výsledek = podmÃnka ? hodnota1 : hodnota2;
Vyhodnotà se podmÃnka: je-li splnÄna, vrátà se hodnota1, jinak se vrátà hodnota2.
PÅÃklad:
let pÅÃstupPovolen = (vÄk > 18) ? true : false;
Technicky můžeme závorky kolem vÄk > 18 vynechat. Operátor otaznÃku má nÃzkou prioritu, a proto se vykoná až po porovnánà >.
Tento pÅÃklad provede totéž jako pÅedchozÃ:
// porovnávacà operátor âvÄk > 18â se vykoná jako prvnÃ
// (nenà tÅeba jej uzavÃrat do závorek)
let pÅÃstupPovolen = vÄk > 18 ? true : false;
Závorky vÅ¡ak zlepÅ¡ujà Äitelnost kódu, a proto je doporuÄujeme použÃvat.
Ve výše uvedeném pÅÃkladu se můžeme operátoru otaznÃku úplnÄ vyhnout, protože samo porovnánà vracà true/false:
// totéž
let pÅÃstupPovolen = vÄk > 18;
VÃce â?â za sebou
Sekvence nÄkolika operátorů otaznÃku ? může vrátit hodnotu, která závisà na vÃce než jedné podmÃnce.
PÅÃklad:
let vÄk = prompt('VÄk?', 18);
let zpráva = (vÄk < 3) ? 'Nazdar, mimino!' :
(vÄk < 18) ? 'Ahoj!' :
(vÄk < 100) ? 'Dobrý den!' :
'To je ale vysoký vÄk!';
alert( zpráva );
Na prvnà pohled může být obtÞné pochopit, o co tady jde. Po bližšÃm prozkoumánà vÅ¡ak vidÃme, že to je jen obyÄejná posloupnost testů:
- Prvnà otaznÃk ovÄÅÃ, zda
vÄk < 3. - Pokud ano, vrátÃ
'Nazdar, mimino!'. Jinak pokraÄuje výrazem za dvojteÄkou â:â a ovÄÅÃvÄk < 18. - Pokud to platÃ, vrátÃ
'Ahoj!'. Jinak pokraÄuje výrazem za dalšà dvojteÄkou â:â a ovÄÅÃvÄk < 100. - Pokud to platÃ, vrátÃ
'Dobrý den!'. Jinak pokraÄuje výrazem za poslednà dvojteÄkou â:â a vrátÃ'To je ale vysoký vÄk!'.
PÅi použità if..else by to vypadalo následovnÄ:
if (vÄk < 3) {
zpráva = 'Nazdar, mimino!';
} else if (vÄk < 18) {
zpráva = 'Ahoj!';
} else if (vÄk < 100) {
zpráva = 'Dobrý den!';
} else {
zpráva = 'To je ale vysoký vÄk!';
}
NetradiÄnà použità â?â
NÄkdy se otaznÃk ? použÃvá jako náhrada za if:
let firma = prompt('Která firma vytvoÅila JavaScript?', '');
(firma == 'Netscape') ?
alert('SprávnÄ!') : alert('Å patnÄ.');
Podle platnosti podmÃnky firma == 'Netscape' se buÄ prvnÃ, nebo druhý výraz za ? vykoná a zobrazà zprávu.
Zde nepÅiÅazujeme výsledek žádné promÄnné. MÃsto toho v závislosti na podmÃnce spouÅ¡tÃme různý kód.
NedoporuÄuje se použÃvat operátor otaznÃku tÃmto způsobem.
Zápis je sice kratšà než odpovÃdajÃcà pÅÃkaz if, což může na nÄkteré programátory zapůsobit, ale je také ménÄ Äitelný.
Zde je stejný kód, který pro porovnánà použÃvá if:
let firma = prompt('Která firma vytvoÅila JavaScript?', '');
if (firma == 'Netscape') {
alert('SprávnÄ!');
} else {
alert('Å patnÄ.');
}
NaÅ¡e oÄi projÞdÄjà kód shora dolů. Bloky kódu, které jsou roztaženy pÅes nÄkolik Åádků, pochopÃme snadnÄji než dlouhou vodorovnou Åadu instrukcÃ.
ÃÄelem operátoru otaznÃku ? je vrátit jednu nebo druhou hodnotu podle platnosti jeho podmÃnky. ProsÃme, použÃvejte jej pÅesnÄ takto. Když budete potÅebovat vykonat různé vÄtve kódu, použijte if.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)