2.7 For...of
Výuka
Problém s klasickým for
Když chceš projít pole, klasický for je zbytečně složitý:
const fruits = ["jablko", "banán", "třešeň"];
// ❌ Klasický for - musíš spravovat index
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
Musíš:
- Vytvořit proměnnou
i - Kontrolovat
i < fruits.length - Inkrementovat
i++ - Přistupovat k prvku přes
fruits[i]
for...of - elegantní řešení
// ✅ for...of - přímo hodnoty
for (const fruit of fruits) {
console.log(fruit);
}
for...of iteruje přes hodnoty iterovatelných objektů:
- Pole (Array)
- Řetězce (String)
- Map, Set
- NodeList (DOM)
- Arguments
- Generátory
Syntaxe
for (const prvek of iterovatelnyObjekt) {
// prvek je aktuální hodnota
}
JavaScript
// Pole
const colors = ["červená", "zelená", "modrá"];
for (const color of colors) {
console.log(color);
}
// "červená", "zelená", "modrá"
// String - iteruje přes znaky
const word = "Ahoj";
for (const char of word) {
console.log(char);
}
// "A", "h", "o", "j"
// Set - unikátní hodnoty
const uniqueNumbers = new Set([1, 2, 2, 3, 3, 3]);
for (const num of uniqueNumbers) {
console.log(num);
}
// 1, 2, 3
// Map - klíč-hodnota páry
const userMap = new Map([
["name", "Jan"],
["age", 25],
["city", "Praha"]
]);
for (const [key, value] of userMap) {
console.log(`${key}: ${value}`);
}
// "name: Jan", "age: 25", "city: Praha"
// Destructuring v for...of
const users = [
{ name: "Jan", age: 25 },
{ name: "Petra", age: 30 }
];
for (const { name, age } of users) {
console.log(`${name} má ${age} let`);
}
// S entries() - když potřebuješ index
const fruits = ["jablko", "banán", "třešeň"];
for (const [index, fruit] of fruits.entries()) {
console.log(`${index}: ${fruit}`);
}
// "0: jablko", "1: banán", "2: třešeň"
// NodeList (DOM)
const buttons = document.querySelectorAll("button");
for (const button of buttons) {
button.addEventListener("click", () => {
console.log("Kliknuto!");
});
}
// Arguments (zastaralé, ale stále funguje)
function sum() {
let total = 0;
for (const num of arguments) {
total += num;
}
return total;
}
// let vs const v for...of
for (let item of items) {
item = item.toUpperCase(); // Můžeš přepsat
console.log(item);
}
for (const item of items) {
// item = "něco"; // ❌ Error - const nelze přepsat
console.log(item); // ✅ Ale můžeš číst
}
TypeScript
// Typovaný for...of
const numbers: number[] = [1, 2, 3, 4, 5];
for (const num of numbers) {
// num je automaticky number
console.log(num * 2);
}
// String iterace
const greeting: string = "Ahoj";
for (const char of greeting) {
// char je string (jeden znak)
console.log(char.charCodeAt(0));
}
// Set s typy
const tags: Set<string> = new Set(["js", "ts", "react"]);
for (const tag of tags) {
// tag je string
console.log(tag.toUpperCase());
}
// Map s typy
const scores: Map<string, number> = new Map([
["Jan", 85],
["Petra", 92]
]);
for (const [name, score] of scores) {
// name: string, score: number
console.log(`${name}: ${score} bodů`);
}
// Pole objektů s interface
interface User {
id: number;
name: string;
email: string;
}
const users: User[] = [
{ id: 1, name: "Jan", email: "jan@email.cz" },
{ id: 2, name: "Petra", email: "petra@email.cz" }
];
for (const user of users) {
// user je User - plný autocomplete
console.log(user.name, user.email);
}
// Destructuring s typy
for (const { id, name } of users) {
// id: number, name: string
console.log(`#${id}: ${name}`);
}
// Generická funkce
function logAll<T>(items: Iterable<T>): void {
for (const item of items) {
console.log(item);
}
}
logAll([1, 2, 3]); // number[]
logAll(new Set(["a"])); // Set<string>
logAll("hello"); // string
Rozdíl JS vs TS
| JavaScript | TypeScript |
|---|---|
| Žádná kontrola typu prvku | TS odvodí typ z iterovatelného objektu |
| Chyby za běhu | Chyby při kompilaci |
| Bez autocomplete | Plný autocomplete pro vlastnosti |
const users = [{ name: "Jan" }, { name: "Petra" }];
for (const user of users) {
console.log(user.name); // ✅ TS ví, že user má name
console.log(user.email); // ❌ Error: Property 'email' does not exist
}
Tip
💡 for...of vs forEach:
const numbers = [1, 2, 3, 4, 5];
// for...of - můžeš použít break/continue
for (const num of numbers) {
if (num === 3) break; // ✅ Funguje
console.log(num);
}
// forEach - NEMŮŽEŠ použít break/continue
numbers.forEach(num => {
if (num === 3) return; // Přeskočí jen tuto iteraci
console.log(num);
});
💡 Kdy potřebuješ index, použij entries():
for (const [i, item] of items.entries()) {
console.log(`${i}: ${item}`);
}
// Nebo array metodu
items.forEach((item, i) => {
console.log(`${i}: ${item}`);
});
💡 for...of NEFUNGUJE na obyčejných objektech:
const obj = { a: 1, b: 2 };
// ❌ Error: obj is not iterable
for (const value of obj) { }
// ✅ Použij Object.values/keys/entries
for (const value of Object.values(obj)) {
console.log(value);
}
for (const [key, value] of Object.entries(obj)) {
console.log(key, value);
}
💡 Používej const pokud nepřepisuješ proměnnou:
// ✅ Doporučeno - const je bezpečnější
for (const item of items) {
console.log(item);
}
// let jen pokud potřebuješ přepsat
for (let item of items) {
item = transform(item);
}
Kvíz
Které výroky jsou pravdivé?
❌ - for...of iteruje přes hodnoty, ne klíče (pro klíče je for...in)
✅ - for...of funguje na všech iterovatelných objektech
✅ - Na rozdíl od forEach, v for...of můžeš použít break a continue
❌ - Obyčejné objekty {} nejsou iterovatelné, musíš použít Object.values() apod.
🎯 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ě