Úloha 2 – Zkrácené vyhodnocování (short-circuit) v podmínkách
Úvod do úlohy
Když už umíme používat základní logické operátory &&, || a !, je dobré podívat se hlouběji na to, jak přesně JavaScript vyhodnocuje složené podmínky. Programátoři si často myslí, že se vyhodnotí všechny části výrazu, ale ve skutečnosti to není vždy pravda. JavaScript (a většina jazyků) používá tzv. zkrácené vyhodnocování (short-circuit evaluation). To znamená, že pokud už lze výsledek zjistit z první části, druhá část se vůbec nevyhodnocuje. Tento princip je velmi užitečný, ale může vést i k nečekaným chybám, pokud si ho neuvědomujeme.
Teorie a principy
-
AND (
&&)
Pokud první operand jefalse, výsledek je hnedfalsea druhý operand se už neřeší.
Příklad:false && cokoliv→ vždyfalse. -
OR (
||)
Pokud první operand jetrue, výsledek je hnedtruea druhý operand se už nevyhodnocuje.
Příklad:true || cokoliv→ vždytrue. -
Vedlejší efekty
Pokud jsou v podmínkách volání funkcí nebo operace s efekty (např. změna proměnné, výpis do konzole), nemusí k nim dojít, protože vyhodnocování se zastaví.
Praktické příklady kódu
1. Kratší vyhodnocení s &&
2. Kratší vyhodnocení s ||
3. Praktické využití – kontrola existence
Typické chyby / záludnosti
-
Nečekané přeskočení volání funkce – studenti zapomenou, že funkce se nemusí vykonat, pokud první podmínka rozhodne o výsledku.
-
Používání OR místo defaultní hodnoty – často se používá idiom
let jmeno = vstup || "Neznámý";, ale ten selhává u hodnot jako""nebo0, které jsou falsy, i když mohou být validní. -
Záměna se sekvenčním vyhodnocováním – studenti se mohou mylně domnívat, že
a && bje totéž co „spustit a, pak b“. Ve skutečnosti druhá část nemusí proběhnout. -
Nerozlišování mezi
&&a||– je třeba jasně chápat, že zastavení nastává z opačných důvodů (u AND kvůlifalse, u OR kvůlitrue).
Shrnutí
-
JavaScript používá zkrácené vyhodnocování:
-
false && ...→ druhá část se neprovádí. -
true || ...→ druhá část se neprovádí.
-
-
Tento princip šetří čas i zdroje a využívá se např. při ochraně před chybami typu „čtení z null“.
-
Je však nutné dávat pozor na vedlejší efekty a správné pochopení truthy/falsy hodnot.