2.6 While a do-while
Výuka
Kdy použít while místo for?
for je nejlepší, když víš předem, kolikrát se má cyklus opakovat (např. 10x, nebo pro každý prvek pole).
while je nejlepší, když nevíš předem, kolikrát se bude opakovat - cyklus běží, dokud platí podmínka.
Příklady použití while:
- Čtení uživatelského vstupu, dokud nezadá správnou hodnotu
- Čekání na odpověď serveru
- Zpracování dat, dokud nejsou vyčerpána
- Hry - herní smyčka běží, dokud hráč neprohraje
Anatomie while
while (podmínka) {
// tělo - opakuje se, dokud je podmínka true
}
Pozor: Podmínka se kontroluje před každou iterací. Pokud je hned na začátku false, tělo se nikdy neprovede.
do...while - vždy alespoň jednou
do {
// tělo - provede se ALESPOŇ JEDNOU
} while (podmínka);
Rozdíl: Podmínka se kontroluje po těle, takže tělo se vždy provede minimálně jednou.
JavaScript
// Základní while
let count = 0;
while (count < 5) {
console.log(count);
count++;
}
// 0, 1, 2, 3, 4
// While s neznámým počtem iterací
let number = 1;
while (number < 1000) {
number *= 2;
console.log(number);
}
// 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024
// Čtení vstupu (simulace)
let password = "";
let attempts = 0;
while (password !== "secret" && attempts < 3) {
password = prompt("Zadej heslo:"); // simulace
attempts++;
}
if (password === "secret") {
console.log("Přístup povolen");
} else {
console.log("Příliš mnoho pokusů");
}
// do...while - vždy alespoň jednou
let input;
do {
input = prompt("Zadej číslo větší než 10:");
} while (input <= 10);
console.log(`Zadal jsi: ${input}`);
// Rozdíl while vs do...while
let x = 10;
while (x < 5) {
console.log("while:", x); // NIKDY se neprovede
x++;
}
let y = 10;
do {
console.log("do-while:", y); // Provede se JEDNOU
y++;
} while (y < 5);
// Procházení pole s while (ne moc běžné)
const fruits = ["jablko", "banán", "třešeň"];
let i = 0;
while (i < fruits.length) {
console.log(fruits[i]);
i++;
}
// Hledání v poli
const numbers = [4, 7, 2, 9, 1, 5];
let index = 0;
while (index < numbers.length && numbers[index] !== 9) {
index++;
}
console.log(`Číslo 9 nalezeno na indexu: ${index}`);
// Generování náhodných čísel, dokud nepadne 6
let dice;
let rolls = 0;
do {
dice = Math.floor(Math.random() * 6) + 1;
rolls++;
console.log(`Hod ${rolls}: ${dice}`);
} while (dice !== 6);
console.log(`Padla 6 po ${rolls} hodech`);
TypeScript
// Typovaný while
let count: number = 0;
while (count < 5) {
console.log(count);
count++;
}
// Funkce s while
function findFirstNegative(numbers: number[]): number | undefined {
let i = 0;
while (i < numbers.length) {
if (numbers[i] < 0) {
return numbers[i];
}
i++;
}
return undefined;
}
const result = findFirstNegative([1, 2, -3, 4]);
console.log(result); // -3
// do...while s typy
function getValidInput(): number {
let input: number;
do {
const raw = prompt("Zadej kladné číslo:");
input = Number(raw);
} while (isNaN(input) || input <= 0);
return input;
}
// Iterator pattern
interface Iterator<T> {
hasNext(): boolean;
next(): T;
}
function processAll<T>(iterator: Iterator<T>): T[] {
const results: T[] = [];
while (iterator.hasNext()) {
results.push(iterator.next());
}
return results;
}
// Async while (simulace)
async function pollUntilReady(checkFn: () => Promise<boolean>): Promise<void> {
let ready = false;
while (!ready) {
ready = await checkFn();
if (!ready) {
await new Promise(resolve => setTimeout(resolve, 1000));
}
}
}
// Narrowing v while
function processQueue(queue: (string | null)[]): void {
let item = queue.shift();
while (item !== null && item !== undefined) {
// TypeScript ví, že item je string
console.log(item.toUpperCase());
item = queue.shift();
}
}
Rozdíl JS vs TS
| JavaScript | TypeScript |
|---|---|
| Žádná kontrola typů | TS kontroluje typy v podmínce |
| Proměnné mohou měnit typ | Typy zůstávají konzistentní |
| Chyby za běhu | Chyby při kompilaci |
// TypeScript pomáhá s kontrolou
let count: number = 0;
while (count < "5") { // ❌ Error: nelze porovnat number a string
count++;
}
// Správně
while (count < 5) {
count++;
}
Tip
💡 Vždy zajisti, že se podmínka změní:
// ❌ NEKONEČNÝ CYKLUS!
let i = 0;
while (i < 10) {
console.log(i);
// Zapomněl jsem i++!
}
// ✅ Správně
let i = 0;
while (i < 10) {
console.log(i);
i++; // Podmínka se změní
}
💡 Používej do...while pro validaci vstupu:
// ✅ Vždy se zeptá alespoň jednou
let age;
do {
age = parseInt(prompt("Zadej věk (1-120):"));
} while (isNaN(age) || age < 1 || age > 120);
💡 Přidej maximální počet iterací jako pojistku:
// ✅ Pojistka proti nekonečné smyčce
let attempts = 0;
const MAX_ATTEMPTS = 1000;
while (condition && attempts < MAX_ATTEMPTS) {
// ...
attempts++;
}
if (attempts >= MAX_ATTEMPTS) {
console.error("Příliš mnoho pokusů");
}
💡 while (true) s break je validní pattern:
while (true) {
const input = getUserInput();
if (input === "quit") {
break; // Ukončí cyklus
}
processInput(input);
}
Kvíz
Které výroky jsou pravdivé?
❌ - Nejsou zaměnitelné: while může neprovést tělo nikdy, do...while vždy alespoň jednou
✅ - do...while provede tělo před kontrolou podmínky, tedy alespoň jednou
❌ - V while se podmínka kontroluje PŘED každou iterací (ne po)
✅ - while je ideální pro situace, kdy nevíme předem kolik iterací bude potřeba
🎯 Závěrečný projekt
Po dokončení všech 8 dílů vytvoříte jednoduchou Todо aplikaci v čistém JavaScriptu. Naučíte se, jak aplikovat vše, co jste se naučili, na reálný projekt.
Zobrazit podrobnosti projektu →Informace o seriálu
Obtížnost
Délka
Cca 480 minut
Počet videí
8 videí + projekty
Certifikát
Po dokončení obdržíte certifikát
Lekce v této sekci
- 2.1 If / else
- 2.2 Else if
- 2.3 Ternární operátor
- 2.4 Switch
- 2.5 For cyklus
- 2.6 While a do-while
- 2.7 For...of
- 2.8 For...in
- 2.9 Break a continue
- 2.10 Truthy a Falsy hodnoty
Struktura lekcí (souborový strom)
- 1.1 Úvod do JavaScriptu a TypeScriptu
- 1.2 Nastavení prostředí
- 1.3 První program
- 1.4 Proměnné: var, let, const
- 1.5 Datové typy - přehled
- 1.6 String (řetězce)
- 1.7 Number (čísla)
- 1.8 Boolean (pravda/nepravda)
- 1.9 Null a Undefined
- 1.10 Type Inference vs Annotations
- 1.11 Aritmetické operátory
- 1.12 Porovnávací operátory
- 1.13 Logické operátory
- 1.14 Komentáře
- 1.15 Console metody
- 03.01 Deklarace funkce
- 03.02 Function Expression
- 03.03 Arrow Functions
- 03.04 Parametry a argumenty
- 03.05 Return hodnoty
- 03.06 Výchozí parametry
- 03.07 Rest parametry
- 03.08 Co je Scope
- 03.09 Lexikální Scope
- 03.10 Řetězec Scope
- 03.11 Globální Scope
- 03.12 Životní Cyklus Proměnných
- 03.13 Omezení Scope
- 03.14 Použití Closures
- 03.15 Callback funkce
- 03.16 Higher-order Functions
- 03.17 IIFE
- 03.18 Void funkce
- 03.19 Rekurze
- v přípravě
- v přípravě
- v přípravě
- v přípravě
- 01 — Co je Next.js
- 02 — Vytvoření projektu
- 03 — Struktura projektu (app/)
- 04 — Page komponenty (page.js / page.tsx)
- 05 — Layout komponenty (layout.js / layout.tsx)
- 06 — File-based routing
- 07 — Dynamické routy ([id]/page.js)
- 08 — Link komponenta (navigace)
- 09 — Image komponenta (next/image)
- 10 — Metadata (title, description, Open Graph)
- 11 — Loading UI (loading.js / loading.tsx)
- 12 — Error handling (error.js / error.tsx)
- 13 — Not Found (not-found.js / not-found.tsx)
- v přípravě
- v přípravě
- v přípravě