Úvod do úlohy

Když píšeme výrazy v JavaScriptu, často kombinujeme více různých operátorů – například +, -, *, /, % nebo i logické operátory jako && a ||. Možná se vám zdá, že počítač prostě vše vyhodnotí „zleva doprava“, ale ve skutečnosti to tak není. Programovací jazyky (včetně JavaScriptu) mají přesně daná pravidla precedence (priorita operátorů) a asociativity (směr vyhodnocování). Pokud těmto pravidlům nerozumíme, můžeme dostat úplně jiný výsledek, než bychom čekali. Umět číst i psát složitější výrazy bez závorek, nebo naopak umět závorkami jednoznačně určit pořadí výpočtu, je proto základní dovedností každého programátora.


Teorie a principy

  1. Precedence (priorita)

    • Určuje, který operátor se vyhodnotí dříve.

    • Například * a / mají vyšší prioritu než + a -.

    • Proto 2 + 3 * 4 není (2 + 3) * 4, ale 2 + (3 * 4) → výsledek je 14.

  2. Asociativita (směr vyhodnocování)

    • Řeší, jak se vyhodnocují operátory se stejnou prioritou.

    • Většina aritmetických operátorů (+, -, *, /, %) se vyhodnocuje zleva doprava.

    • Některé jiné, například přiřazovací (=, +=, -=) nebo exponentační (**), mají pravou asociativitu.

    • Příklad: 2 ** 3 ** 2 je 2 ** (3 ** 2) → 2 ** 9 → 512, nikoli (2 ** 3) ** 2.

  3. Závorky

    • Mají vždy nejvyšší prioritu.

    • Používáme je, když chceme, aby počítač postupoval podle našeho záměru a ne jen podle obecných pravidel.


Praktické příklady kódu

Aritmetické operátory

Exponentace a asociativita

Kombinace více operátorů


Typické chyby / záludnosti

  • Ignorování závorek: studenti často předpokládají, že program vyhodnocuje operace stejně, jako by to „četli v hlavě“. To ale vede k chybám.

  • Exponentace: mnoho lidí si myslí, že 2 ** 3 ** 2 je (2 ** 3) ** 2, protože jsou zvyklí na levou asociativitu.

  • Kombinace aritmetických a logických operátorů: například true || false && false dává true, protože && má vyšší prioritu než ||.

  • Přiřazovací operátory: a = b = 5 se vyhodnocuje zprava, takže nejprve b = 5, pak a = b.


Shrnutí

  • Precedence určuje, který operátor má přednost.

  • Asociativita určuje, zda se operátory stejné priority vyhodnocují zleva nebo zprava.

  • Závorky mají vždy nejvyšší prioritu a slouží k jednoznačnému určení pořadí výpočtu.

  • Nejčastější pasti: exponentace, kombinace logických operátorů a řetězení přiřazení.

  • Pokud si nejsme jistí, vždy je lepší závorky výslovně napsat – kód bude čitelnější a méně náchylný k chybám.