Úloha 5 – Typické chyby při přiřazování a jak je opravit

Stránky: Moodle ZČU
Kurz: Sada úloh pro procvičení v předmětu KVD/PGM1P (BP Vítek Dolný)
Kniha: Úloha 5 – Typické chyby při přiřazování a jak je opravit
Vytiskl(a): Nepřihlášený host
Datum: neděle, 18. října 2026, 17.29

Úvod do úlohy

I zkušeným programátorům se občas stane, že zamění přiřazení za porovnání, přepíšou proměnnou nechtěným řetězením přiřazení nebo narazí na záludné přetypování. Tyto chyby jsou zrádné hlavně tím, že kód funguje—jen jinak, než čekáte. Cílem této části je naučit se takové situace rozpoznat, vysvětlit jejich chování a opravit je tak, aby výsledky byly jasné a předvídatelné.


Teorie a principy

  • Přiřazení vs. porovnání

    • = je přiřazení (vrací přiřazenou hodnotu).

    • == je volné porovnání (s typovou konverzí).

    • === je striktní porovnání (bez konverze typů) – preferovaná volba.

  • Přiřazení jako výraz

    • Výraz a = 5 má hodnotu 5. V podmínkách to může vést k nechtěnému chování.

  • Řetězení přiřazení

    • a = b = 0; je legální, ale méně čitelné. Navíc může nechtěně ovlivnit více proměnných najednou.

  • Přetypování (type coercion)

    • += s řetězcem provede konkatenaci, nikoli sčítání.

    • -= *= /= převádějí na čísla; neplatný převod dává NaN.

  • Strict mode a deklarace proměnných

    • V režimu "use strict" je přiřazení do nedefinované proměnné chyba. Pomáhá chytat překlepy a nechtěné globální proměnné.


Praktické příklady kódu

1) Nechtěné přiřazení v podmínce

 

2) Řetězení přiřazení a čitelnost

 

3) Neočekávané přetypování u +=

4) Volné vs. striktní porovnání

 

5) NaN při neplatném převodu

 

6) Zbytek po dělení u záporných čísel (%)

 

7) Nechtěné globální proměnné (bez strict mode)

 


Typické chyby / záludnosti

  • Záměna = za ==/=== v podmínkách → podmínka vždy „platí“ a maskuje chybu.

  • Řetězení přiřazení → nízká čitelnost, nechtěné vedlejší efekty.

  • Nevědomé přetypování → "5" + 5 → "55", ne 10; neplatný převod → NaN.

  • Neexistující deklarace proměnných (mimo strict mode) → tiché vytváření globálů.

  • Porovnání s volnou rovností == → překvapivé shody (např. "" == 0 je true).


Shrnutí

  • Důsledně rozlišujte přiřazení (=) a porovnání (=== doporučeno).

  • Přiřazení je výraz – v podmínkách může vyvolat skryté chyby.

  • Řetězení přiřazení používejte střídmě; upřednostněte čitelnost.

  • Kontrolujte přetypování u +=, -= apod.; validujte vstupy a používejte Number.isNaN.

  • V případě potřeby zajišťujte kladný zbytek u % a zapněte "use strict" (nebo TypeScript) pro odhalení chyb dřív.

Úloha

Zadání (kontext úlohy)

Pracuj v čistém souboru script.js a u každého bodu:

  • napiš kód,

  • do konzole vypiš co a proč se stalo,

  • pokud je to chybné použití, oprav ho a ukaž správný výsledek.


1. Přiřazení v podmínce
  • Máš kód s proměnnou wins.

  • V podmínce je omylem použito přiřazení místo porovnání.

  • Ukaž, co to udělá a proč.

  • Oprav na striktní porovnání (===).


2. Řetězení přiřazení
  • Inicializuj x, y, z tak, že jedním zápisem nastavíš všechny na 10.

  • Poté proveď y += 5.

  • Vypiš hodnoty x, y, z a vysvětli, proč vyšly právě tak (řetězení se vyhodnocuje zprava doleva).

  • Přepiš inicializaci na srozumitelnější podobu (bez řetězení).


3. += a řetězce
  • let count = 10; let input = "5";
  • Proveď count += input a ukaž, co se stalo s typem a hodnotou.
  • Oprav tak, aby proběhlo číselné sčítání (např. count += Number(input)).


4. *= a NaN
  • let base = "10px";
  • Proveď base *= 2, ukaž výsledek a vysvětli, proč vznikne NaN (řetězec nelze přímo násobit).

  • Oprav tak, aby výpočet dal číslo (např. parseInt(base, 10) * 2).


5. Neinicializovaná vlastnost
  • let user = {};
  • Zkus user.points += 1 a ukaž výsledek (výjde NaN, protože points je undefined).

  • Oprav tak, aby points začínalo od 0 a po zvýšení mělo správnou hodnotu.


Cíl úlohy
  • Rozlišit přiřazení a porovnání a umět chybu odhalit i vysvětlit.

  • Pochopit vyhodnocování řetězení přiřazení (zprava doleva).

  • Umět pracovat s přetypováním u +=, *=, %= a předejít NaN.

  • Správně inicializovat hodnoty před aritmetikou.


Vstupní podmínky
  • Startovní soubor script.js.

  • Smíš upravovat a doplňovat kód pouze podle zadání.


Požadovaný výstup
  • Ke každému bodu bude v konzoli:

    • původní chování + krátké vysvětlení,

    • opravená verze se správným výsledkem.


Doplňující pokyny
  • Preferuj === před ==.

  • U číselných vstupů ze stringu použij Number(), parseInt(str, 10) nebo parseFloat().

  • Nepoužívej var.

  • Piš krátké, výstižné komentáře k vysvětlení.

Řešení úlohy

Co je zde splněno:

  • Odhaleno a opraveno přiřazení v podmínce (= → ===).

  • Vysvětleno řetězení přiřazení (zprava doleva) a ukázána čitelnější alternativa.

  • Demonstrována konkatenace přes += se stringem a správná oprava na číselné sčítání.

  • Vysvětlena příčina NaN u *= s nečíselným řetězcem a oprava pomocí parsování.

  • Správná inicializace hodnot před aritmetikou (undefined += 1 → NaN → inicializovat na 0).