Ú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 je false, výsledek je hned false a druhý operand se už neřeší.
    Příklad: false && cokoliv → vždy false.

  • OR (||)
    Pokud první operand je true, výsledek je hned true a druhý operand se už nevyhodnocuje.
    Příklad: true || cokoliv → vždy true.

  • 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 "" nebo 0, 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 && b je 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ůli false, u OR kvůli true).

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.