V JavaScriptu jsou ÄtyÅi logické operátory: || (OR â nebo), && (AND â a), ! (NOT â ne), ?? (koalescence). V tomto Älánku vysvÄtlÃme prvnà tÅi, operátor ?? bude vysvÄtlen v dalÅ¡Ãm Älánku.
AÄkoli se nazývajà âlogickéâ, mohou být použity na hodnoty libovolného typu, nejenom boolean. Také jejich výsledek může být jakéhokoli typu.
PodÃvejme se na podrobnosti.
|| (OR)
Operátor âORâ (âneboâ) je reprezentován dvÄma svislými Äarami za sebou:
výsledek = a || b;
V klasickém programovánà je logické OR urÄeno pouze k manipulaci s booleovskými hodnotami. Je-li nÄkterý z jeho argumentů true, vrátà true, jinak vrátà false.
V JavaScriptu je tento operátor trochu rafinovanÄjšà a silnÄjÅ¡Ã. Nejprve se vÅ¡ak podÃvejme, co se stane s hodnotami typu boolean.
Existujà ÄtyÅi možné logické kombinace:
alert( true || true ); // true
alert( false || true ); // true
alert( true || false ); // true
alert( false || false ); // false
Jak vidÃme, výsledek je vždy true kromÄ pÅÃpadu, kdy jsou oba operandy false.
NenÃ-li operand typu boolean, je pro úÄel vyhodnocenà pÅeveden na boolean.
NapÅÃklad ÄÃslo 1 se pÅevede na true, ÄÃslo 0 na false:
if (1 || 0) { // funguje stejnÄ jako if ( true || false )
alert( 'pravda!' );
}
VÄtÅ¡inou se OR || použÃvá v pÅÃkazu if k otestovánÃ, zda nÄkterá ze zadaných podmÃnek je true.
PÅÃklad:
let hodina = 9;
if (hodina < 10 || hodina > 18) {
alert( 'ÃÅad má zavÅeno.' );
}
Můžeme pÅedat dalšà podmÃnky:
let hodina = 12;
let jeVÃkend = true;
if (hodina < 10 || hodina > 18 || jeVÃkend) {
alert( 'ÃÅad má zavÅeno.' ); // je vÃkend
}
OR â||â najde prvnà pravdivou hodnotu
Výše uvedená logika je vcelku klasická. Nynà se podÃvejme na âextraâ vlastnosti JavaScriptu.
RozÅ¡ÃÅený algoritmus funguje následovnÄ.
Zadáme vÃce hodnot, spojených ORem:
výsledek = hodnota1 || hodnota2 || hodnota3;
Operátor OR || provádà následujÃcÃ:
- Vyhodnocuje operandy zleva doprava.
- Každý operand pÅevede na typ boolean. Je-li výsledek
true, zastavà se a vrátà původnà hodnotu tohoto operandu. - Pokud byly vyhodnoceny všechny operandy (tj. všechny byly
false), vrátà poslednà operand.
Hodnota se vrátà ve své původnà podobÄ bez konverze.
Jinými slovy, ÅetÄzec ORů "||" vrátà prvnà pravdivou hodnotu, a pokud nenà žádná pravdivá hodnota nalezena, vrátà poslednà hodnotu.
PÅÃklad:
alert( 1 || 0 ); // 1 (1 je pravdivá)
alert( null || 1 ); // 1 (1 je prvnà pravdivá hodnota)
alert( null || 0 || 1 ); // 1 (prvnà pravdivá hodnota)
alert( undefined || null || 0 ); // 0 (všechny jsou nepravdivé, vrátà poslednà hodnotu)
To umožÅuje nÄkteré zajÃmavé způsoby použità ve srovnánà s âÄistým, klasickým, pouze booleovským ORemâ.
-
ZÃskánà prvnà pravdivé hodnoty ze seznamu promÄnných nebo výrazů.
NapÅÃklad máme promÄnné
jméno,pÅÃjmenÃapÅezdÃvka, vÅ¡echny jsou nepovinné (tj. mohou býtundefinednebo obsahovat hodnoty nepravda).Vybereme pomocà OR
||tu, která obsahuje data, a zobrazÃme je (nenÃ-li nastaveno nic, zobrazÃmeanonym):let jméno = ""; let pÅÃjmenà = ""; let pÅezdÃvka = "SuperCoder"; alert( jméno || pÅÃjmenà || pÅezdÃvka || "anonym"); // SuperCoderKdyby vÅ¡echny promÄnné obsahovaly hodnotu nepravda, zobrazil by se
anonym. -
Zkrácené vyhodnocenÃ.
Dalšà vlastnostà operátoru OR
||je tzv. âzkrácenéâ vyhodnocenÃ.Znamená to, že
||zpracovává své argumenty, dokud nenarazà na prvnà pravdivou hodnotu, a pak tuto hodnotu okamžitÄ vrátÃ, aniž by se byÅ¥ jen dotkl dalÅ¡Ãch argumentů.Důležitost této vlastnosti se projevÃ, jestliže operandem nebude pouhá hodnota, ale výraz s vedlejÅ¡Ãm efektem, napÅÃklad pÅiÅazenà promÄnné nebo volánà funkce.
V nÞe uvedeném pÅÃkladu se zobrazà jen druhá zpráva:
true || alert("nezobrazà se"); false || alert("zobrazà se");Operátor OR
||na prvnÃm Åádku se pÅestane vyhodnocovat ihned poté, co narazà natrue, takžealertse nevykoná.NÄkdy lidé využÃvajà tuto vlastnost k tomu, aby vykonali pÅÃkaz jen tehdy, nenÃ-li splnÄna podmÃnka na levé stranÄ.
&& (AND)
Operátor âANDâ (âaâ) je reprezentován dvÄma znaky âampersandâ &&:
výsledek = a && b;
V klasickém programovánà AND vracà true, jsou-li oba operandy pravdivé, a false jinak:
alert( true && true ); // true
alert( false && true ); // false
alert( true && false ); // false
alert( false && false ); // false
PÅÃklad s if:
let hodina = 12;
let minuta = 30;
if (hodina == 12 && minuta == 30) {
alert( 'Je právÄ 12:30' );
}
StejnÄ jako u OR může být operandem AND jakákoli hodnota:
if (1 && 0) { // vyhodnotà se jako true && false
alert( "nevykoná se, protože výsledkem je nepravda" );
}
AND â&&â najde prvnà nepravdivou hodnotu
MÄjme nÄkolik hodnot spojených ANDem:
výsledek = hodnota1 && hodnota2 && hodnota3;
Operátor AND && provádà následujÃcÃ:
- Vyhodnocuje operandy zleva doprava.
- Každý operand pÅevede na typ boolean. Je-li výsledek
false, zastavà se a vrátà původnà hodnotu tohoto operandu. - Pokud byly vyhodnoceny všechny operandy (tj. všechny byly pravdivé), vrátà poslednà operand.
Jinými slovy, ÅetÄzec ANDů "&&" vrátà prvnà nepravdivou hodnotu, a pokud nenà žádná nepravdivá hodnota nalezena, vrátà poslednà hodnotu.
Výše uvedená pravidla se podobajà operátoru OR. RozdÃl spoÄÃvá v tom, že AND najde prvnà nepravdivou hodnotu, zatÃmco OR najde prvnà pravdivou.
PÅÃklady:
// je-li prvnà operand pravdivý,
// AND vrátà druhý operand:
alert( 1 && 0 ); // 0
alert( 1 && 5 ); // 5
// je-li prvnà operand nepravdivý,
// AND ho vrátÃ. Druhý operand se pak ignoruje.
alert( null && 5 ); // null
alert( 0 && "je jedno co" ); // 0
Můžeme pÅedat i vÃce hodnot za sebou. PodÃvejme se, jak se vrátà prvnà nepravdivá:
alert( 1 && 2 && null && 3 ); // null
Když jsou všechny hodnoty pravdivé, vrátà se poslednà z nich:
alert( 1 && 2 && 3 ); // 3, poslednà hodnota
&& je vyššà než priorita OR ||Priorita operátoru AND && je vyššà než priorita operátoru OR ||.
Kód a && b || c && d je tedy v zásadÄ stejný, jako kdyby výrazy s && byly uzavÅeny do závorek: (a && b) || (c && d).
if operátorem || nebo &&NÄkdy lidé použÃvajà operátor AND && jako âkratšà variantu ifâ.
PÅÃklad:
let x = 1;
(x > 0) && alert( 'VÄtšà než nula!' );
Akce napravo od && se vykoná jen tehdy, když k nà dospÄje vyhodnocovánÃ, tedy jen když (x > 0) platÃ.
Máme tedy v zásadÄ analogii k:
let x = 1;
if (x > 0) alert( 'VÄtšà než nula!' );
AÄkoli varianta s && se zdá být kratÅ¡Ã, if je zÅejmÄjšà a obvykle bývá trochu ÄitelnÄjÅ¡Ã. DoporuÄujeme tedy použÃvat každou konstrukci k tomu, k Äemu byla stvoÅena: použÃvejte if, chcete-li âpokudâ, a použÃvejte &&, chcete-li AND.
! (NOT)
Booleovský operátor âNOTâ (âneâ) je reprezentován vykÅiÄnÃkem !.
Jeho syntaxe je velice jednoduchá:
výsledek = !hodnota;
Tento operátor pÅijÃmá jediný argument a provádà následujÃcÃ:
- PÅevede operand na typ boolean:
true/false. - Vrátà opaÄnou hodnotu.
PÅÃklad:
alert( !true ); // false
alert( !0 ); // true
NÄkdy se použÃvá dvojité NOT !! ke konverzi hodnoty na typ boolean:
alert( !!"neprázdný ÅetÄzec" ); // true
alert( !!null ); // false
Znamená to, že prvnà NOT pÅevede hodnotu na boolean a vrátà opak, druhý NOT jej znovu pÅevrátÃ. Na konci tedy máme planou konverzi na boolean.
Existuje trochu výmluvnÄjšà způsob, jak udÄlat totéž â vestavÄná funkce Boolean:
alert( Boolean("neprázdný ÅetÄzec") ); // true
alert( Boolean(null) ); // false
Operátor NOT ! má nejvyššà prioritu ze vÅ¡ech logických operátorů, takže se vždy vykoná jako prvnÃ, dÅÃve než && nebo ||.
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â¦)