2.5 For cyklus
Výuka
Proč potřebujeme cykly?
Představ si, že chceš vypsat čísla od 1 do 100. Bez cyklů bys musel napsat 100 řádků:
console.log(1);
console.log(2);
console.log(3);
// ... 97 dalších řádků
Cykly (smyčky, loops) umožňují opakovat kód automaticky.
Anatomie for cyklu
for (inicializace; podmínka; aktualizace) {
// tělo cyklu - opakuje se
}
3 části for cyklu:
- Inicializace - provede se jednou na začátku (např.
let i = 0) - Podmínka - kontroluje se před každou iterací (např.
i < 10) - Aktualizace - provede se po každé iteraci (např.
i++)
Jak to funguje krok po kroku?
for (let i = 0; i < 3; i++) {
console.log(i);
}
| Krok | Akce | i | Podmínka | Výstup |
|---|---|---|---|---|
| 1 | Inicializace | 0 | — | — |
| 2 | Kontrola podmínky | 0 | 0 < 3 ✅ | — |
| 3 | Tělo cyklu | 0 | — | "0" |
| 4 | Aktualizace | 1 | — | — |
| 5 | Kontrola podmínky | 1 | 1 < 3 ✅ | — |
| 6 | Tělo cyklu | 1 | — | "1" |
| 7 | Aktualizace | 2 | — | — |
| 8 | Kontrola podmínky | 2 | 2 < 3 ✅ | — |
| 9 | Tělo cyklu | 2 | — | "2" |
| 10 | Aktualizace | 3 | — | — |
| 11 | Kontrola podmínky | 3 | 3 < 3 ❌ | — |
| 12 | Konec cyklu | — | — | — |
JavaScript
// Základní for - čísla 0 až 4
for (let i = 0; i < 5; i++) {
console.log(i);
}
// 0, 1, 2, 3, 4
// Počítání pozpátku
for (let i = 5; i > 0; i--) {
console.log(i);
}
// 5, 4, 3, 2, 1
// Skok po dvou
for (let i = 0; i <= 10; i += 2) {
console.log(i);
}
// 0, 2, 4, 6, 8, 10
// Iterace přes pole (starý způsob)
const fruits = ["jablko", "banán", "třešeň"];
for (let i = 0; i < fruits.length; i++) {
console.log(`${i}: ${fruits[i]}`);
}
// "0: jablko", "1: banán", "2: třešeň"
// Vnořené cykly (tabulka násobení)
for (let i = 1; i <= 3; i++) {
for (let j = 1; j <= 3; j++) {
console.log(`${i} × ${j} = ${i * j}`);
}
}
// Součet čísel 1 až 100
let sum = 0;
for (let i = 1; i <= 100; i++) {
sum += i;
}
console.log(sum); // 5050
// For bez některých částí
let i = 0;
for (; i < 3; ) {
console.log(i);
i++;
}
// Funguje, ale while by byl čitelnější
// Nekonečný cyklus (POZOR!)
// for (;;) {
// console.log("Navždy...");
// }
TypeScript
// Typovaný for cyklus
for (let i: number = 0; i < 5; i++) {
console.log(i);
}
// Iterace přes pole s typy
const numbers: number[] = [1, 2, 3, 4, 5];
for (let i = 0; i < numbers.length; i++) {
const num: number = numbers[i];
console.log(num * 2);
}
// Funkce s for cyklem
function sumArray(arr: number[]): number {
let sum = 0;
for (let i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
console.log(sumArray([1, 2, 3, 4, 5])); // 15
// Generická funkce
function findIndex<T>(arr: T[], predicate: (item: T) => boolean): number {
for (let i = 0; i < arr.length; i++) {
if (predicate(arr[i])) {
return i;
}
}
return -1;
}
const index = findIndex([10, 20, 30], (n) => n > 15);
console.log(index); // 1
// Type guard v cyklu
const mixed: (string | number)[] = ["a", 1, "b", 2];
for (let i = 0; i < mixed.length; i++) {
const item = mixed[i];
if (typeof item === "string") {
console.log(item.toUpperCase()); // TS ví, že item je string
} else {
console.log(item.toFixed(2)); // TS ví, že item je number
}
}
// Readonly pole
const readonlyNumbers: readonly number[] = [1, 2, 3];
for (let i = 0; i < readonlyNumbers.length; i++) {
console.log(readonlyNumbers[i]);
// readonlyNumbers[i] = 0; // ❌ Error: readonly
}
Rozdíl JS vs TS
| JavaScript | TypeScript |
|---|---|
Index i může být cokoliv |
TS kontroluje typ indexu |
| Přístup k poli bez kontroly | TS varuje při možném undefined |
| Žádná kontrola mezí | noUncheckedIndexedAccess může přidat kontrolu |
// S noUncheckedIndexedAccess v tsconfig
const arr: number[] = [1, 2, 3];
for (let i = 0; i < arr.length; i++) {
const item = arr[i]; // item: number | undefined
if (item !== undefined) {
console.log(item * 2); // Teď je item: number
}
}
Tip
💡 Pro pole radši použij for...of nebo array metody:
const fruits = ["jablko", "banán"];
// ❌ Starý způsob - více psaní, možnost chyby
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
// ✅ Moderní způsob
for (const fruit of fruits) {
console.log(fruit);
}
// ✅ Nebo array metody
fruits.forEach(fruit => console.log(fruit));
💡 Cachuj length ve výkonnostně kritickém kódu:
// ❌ length se volá každou iteraci
for (let i = 0; i < arr.length; i++) { }
// ✅ length se uloží jednou
for (let i = 0, len = arr.length; i < len; i++) { }
// (V moderních enginech už to není potřeba)
💡 Používej const pro konstantní proměnnou v těle:
for (let i = 0; i < items.length; i++) {
const item = items[i]; // const - nemění se v iteraci
// ...
}
💡 Pozor na nekonečné cykly:
// ❌ Nikdy neskončí!
for (let i = 0; i >= 0; i++) {
console.log(i); // i bude navždy >= 0
}
// ✅ Správná podmínka
for (let i = 0; i < 10; i++) {
console.log(i);
}
Kvíz
Které výroky jsou pravdivé?
❌ - Všechny části jsou volitelné (for (;;) je validní, i když nebezpečný)
✅ - Podmínka se kontroluje před každou iterací (včetně první)
❌ - Aktualizace se provede po těle cyklu, ne před
✅ - for je ideální pro známý počet iterací (0 až n)
🎯 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ě