Domů O mně Služby Portfolio Učím Blog Kontakt
← Zpět na učím

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:

  1. Inicializace - provede se jednou na začátku (např. let i = 0)
  2. Podmínka - kontroluje se před každou iterací (např. i < 10)
  3. 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 →

Připraveni začít?

Zaregistrujte se a získejte přístup ke všem dílům tohoto seriálu

Kontaktujte mě

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


Struktura lekcí (souborový strom)

06. Typescript specifika
  • v přípravě
08. Moduly tridy
  • v přípravě
09. React zaklady
  • v přípravě
10. React hooks
  • v přípravě
12. Nextjs server
  • v přípravě
13. Databaze auth
  • v přípravě
14. Nextjs pokrocile
  • v přípravě