Ú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 = 5má hodnotu5. 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ř."" == 0jetrue).
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žívejteNumber.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,ztak, že jedním zápisem nastavíš všechny na 10. -
Poté proveď
y += 5. -
Vypiš hodnoty
x,y,za 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 += inputa 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č vznikneNaN(ř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 += 1a ukaž výsledek (výjdeNaN, protožepointsjeundefined). -
Oprav tak, aby
pointszačí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ítNaN. -
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)neboparseFloat(). -
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
NaNu*=s nečíselným řetězcem a oprava pomocí parsování. -
Správná inicializace hodnot před aritmetikou (
undefined += 1→NaN→ inicializovat na0).