Podmíněné větvení:pokud, ?

Někdy potřebujeme provést různé akce na základě různých podmínek.

K tomu můžeme použít if a podmíněný operátor ? , který se také nazývá operátor „otazník“.

Příkaz „if“

if(...) příkaz vyhodnotí podmínku v závorkách, a pokud je výsledek true , provede blok kódu.

Například:

let year = prompt('In which year was ECMAScript-2015 specification published?', '');

if (year == 2015) alert( 'You are right!' );

Ve výše uvedeném příkladu je podmínkou jednoduchá kontrola rovnosti (year == 2015 ), ale může to být mnohem složitější.

Pokud chceme provést více než jeden příkaz, musíme náš blok kódu zabalit do složených závorek:

if (year == 2015) {
 alert( "That's correct!" );
 alert( "You're so smart!" );
}

Doporučujeme zabalit blok kódu do složených závorek {} pokaždé, když použijete if příkaz, i když existuje pouze jeden příkaz k provedení. Tím se zlepší čitelnost.

Booleovská konverze

if (…) příkaz vyhodnotí výraz v jeho závorkách a převede výsledek na booleovský.

Připomeňme si pravidla převodu z kapitoly Převody typů:

  • Číslo 0 , prázdný řetězec "" , null , undefined a NaN všechny se stanou false . Proto se jim říká „falešné“ hodnoty.
  • Další hodnoty se stanou true , takže se jim říká „pravdivé“.

Kód za této podmínky by se tedy nikdy nespustil:

if (0) { // 0 is falsy
 ...
}

…a uvnitř této podmínky – vždy bude:

if (1) { // 1 is truthy
 ...
}

Můžeme také předat předem vyhodnocenou booleovskou hodnotu if , takto:

let cond = (year == 2015); // equality evaluates to true or false

if (cond) {
 ...
}

Klauzule „jinak“

if příkaz může obsahovat volitelný blok „else“. Provede se, když je podmínka nepravdivá.

Například:

let year = prompt('In which year was the ECMAScript-2015 specification published?', '');

if (year == 2015) {
 alert( 'You guessed it right!' );
} else {
 alert( 'How can you be so wrong?' ); // any value except 2015
}

Několik podmínek:„jinak, pokud“

Někdy bychom rádi otestovali několik variant podmínky. else if klauzule nám to umožňuje.

Například:

let year = prompt('In which year was the ECMAScript-2015 specification published?', '');

if (year < 2015) {
 alert( 'Too early...' );
} else if (year > 2015) {
 alert( 'Too late' );
} else {
 alert( 'Exactly!' );
}

Ve výše uvedeném kódu JavaScript nejprve zkontroluje year < 2015 . Pokud je to nepravdivé, přejde na další podmínku year > 2015 . Pokud je to také nepravdivé, zobrazí se poslední alert .

Může jich být více else if bloky. Poslední else je volitelné.

Podmíněný operátor ‘?’

Někdy potřebujeme přiřadit proměnnou v závislosti na podmínce.

Například:

let accessAllowed;
let age = prompt('How old are you?', '');

if (age > 18) {
 accessAllowed = true;
} else {
 accessAllowed = false;
}

alert(accessAllowed);

Takzvaný operátor „podmíněný“ nebo „otazník“ nám to umožňuje kratším a jednodušším způsobem.

Operátor je reprezentován otazníkem ? . Někdy se tomu říká „ternární“, protože operátor má tři operandy. Je to vlastně jediný operátor v JavaScriptu, který jich má tolik.

Syntaxe je:

let result = condition ? value1 : value2;

condition se vyhodnocuje:pokud je to pravdivé, pak value1 je vráceno, jinak – value2 .

Například:

let accessAllowed = (age > 18) ? true : false;

Technicky můžeme vynechat závorky kolem age > 18 . Operátor otazníku má nízkou prioritu, takže se spustí po porovnání > .

Tento příklad udělá to samé jako předchozí:

// the comparison operator "age > 18" executes first anyway
// (no need to wrap it into parentheses)
let accessAllowed = age > 18 ? true : false;

Závorky však činí kód čitelnějším, proto je doporučujeme používat.

Poznámka:

Ve výše uvedeném příkladu se můžete vyhnout použití operátoru otazníku, protože samotné porovnání vrátí true/false :

// the same
let accessAllowed = age > 18;

Vícenásobné „?“

Sekvence operátorů s otazníkem ? může vrátit hodnotu, která závisí na více než jedné podmínce.

Například:

let age = prompt('age?', 18);

let message = (age < 3) ? 'Hi, baby!' :
 (age < 18) ? 'Hello!' :
 (age < 100) ? 'Greetings!' :
 'What an unusual age!';

alert( message );

Zpočátku může být těžké pochopit, co se děje. Ale po bližším pohledu vidíme, že je to jen obyčejná sekvence testů:

  1. První otazník kontroluje, zda age < 3 .
  2. Pokud je pravda, vrátí 'Hi, baby!' . V opačném případě pokračuje výrazem za dvojtečkou „:““ a kontroluje age < 18 .
  3. Pokud je to pravda, vrátí 'Hello!' . V opačném případě pokračuje na výraz za další dvojtečkou „:““ a zaškrtne age < 100 .
  4. Pokud je to pravda, vrátí 'Greetings!' . V opačném případě pokračuje výrazem za poslední dvojtečkou „:““ a vrací 'What an unusual age!' .

Takto to vypadá pomocí if..else :

if (age < 3) {
 message = 'Hi, baby!';
} else if (age < 18) {
 message = 'Hello!';
} else if (age < 100) {
 message = 'Greetings!';
} else {
 message = 'What an unusual age!';
}

Netradiční použití „?“

Někdy otazník ? se používá jako náhrada za if :

let company = prompt('Which company created JavaScript?', '');

(company == 'Netscape') ?
 alert('Right!') : alert('Wrong.');

V závislosti na podmínce company == 'Netscape' , buď první nebo druhý výraz za ? se provede a zobrazí výstrahu.

Zde nepřiřazujeme výsledek žádné proměnné. Místo toho spustíme jiný kód v závislosti na podmínce.

Nedoporučujeme používat operátor otazník tímto způsobem.

Zápis je kratší než ekvivalentní if prohlášení, které se líbí některým programátorům. Ale je to méně čitelné.

Zde je stejný kód jako if pro srovnání:

let company = prompt('Which company created JavaScript?', '');

if (company == 'Netscape') {
 alert('Right!');
} else {
 alert('Wrong.');
}

Naše oči skenují kód vertikálně. Bloky kódu, které zabírají několik řádků, jsou srozumitelnější než dlouhá horizontální instrukční sada.

Účel operátoru otazníku ? je vrátit jednu nebo druhou hodnotu v závislosti na jejím stavu. Použijte to prosím přesně k tomu. Použijte if když potřebujete spustit různé větve kódu.