03.06 Výchozí parametry
Výuka
Proč výchozí parametry?
V lekci 04 jsi viděl, že když vynecháš argument, parametr má hodnotu undefined. To vyžaduje ruční kontroly:
const greet = function(name, greeting) {
if (greeting === undefined) {
greeting = "Hello"; // Musíš kontrolovat undefined
}
return greeting + ", " + name;
};
Výchozí parametry (ES6+) to zjednoduší:
const greet = function(name, greeting = "Hello") {
return greeting + ", " + name;
};
Proč je to užitečné?
- Méně kódu - nemusíš psát
if (x === undefined) - Čitelnější - hned vidíš, jaká je výchozí hodnota
- Dokumentace v kódu - jasně říkáš "pokud to vynecháš, použije se tohle"
Představ si to jako: Objednávka kávy. Pokud neřekneš jakou, dostaneš "normální" - to je výchozí hodnota.
Jak to funguje?
1. Napíšeš parametr s = a výchozí hodnotou: function(x = 10) { }
2. Pokud argument chybí nebo je undefined, použije se výchozí hodnota
3. Pokud předáš argument (i když je null), použije se ten
Kdy se použije výchozí hodnota:
- ✅ Argument vynechán:
greet("Alice")→greeting = "Hello" - ✅ Argument je
undefined:greet("Alice", undefined)→greeting = "Hello" - ❌ Argument je
null:greet("Alice", null)→greeting = null(použije se null!)
Klíčové koncepty
- = pro výchozí hodnotu -
function(x = 5)nastaví x na 5, pokud chybí - Použije se jen pro undefined - ne pro
nullnebo jiné falsy hodnoty - Může být výraz - nejen hodnota, ale i volání funkce:
function(x = getDefault()) - Pořadí záleží - výchozí parametry obvykle na konci
JavaScript
Příklad 1: Základní výchozí parametr
const greet = function(name, greeting = "Hello") {
return greeting + ", " + name + "!";
};
console.log(greet("Alice")); // → Hello, Alice!
console.log(greet("Bob", "Hi")); // → Hi, Bob!
console.log(greet("Charlie", "Hey")); // → Hey, Charlie!
Co se stalo?
- Pokud vynecháš druhý argument,
greetingmá hodnotu"Hello" - Pokud ho předáš, použije se tvá hodnota
- Není třeba kontrolovat
if (greeting === undefined)!
Příklad 2: Více výchozích parametrů
const createUser = function(name, age = 18, role = "user") {
return {
name: name,
age: age,
role: role
};
};
console.log(createUser("Alice"));
// → { name: "Alice", age: 18, role: "user" }
console.log(createUser("Bob", 25));
// → { name: "Bob", age: 25, role: "user" }
console.log(createUser("Charlie", 30, "admin"));
// → { name: "Charlie", age: 30, role: "admin" }
Co se stalo?
- Můžeš mít více výchozích parametrů
- Pokud argument vynecháš, použije se výchozí hodnota
- Parametry se vyplňují zleva doprava
Příklad 3: undefined vs null
const test = function(value = "default") {
return value;
};
console.log(test()); // → "default" (argument vynechán)
console.log(test(undefined)); // → "default" (explicitní undefined)
console.log(test(null)); // → null (použije se null!)
console.log(test(0)); // → 0 (použije se 0!)
console.log(test("")); // → "" (použije se prázdný string!)
Co se stalo?
- Výchozí hodnota se použije jen pro undefined
null,0,"",falsejsou validní hodnoty - použijí se!
Příklad 4: Výchozí hodnota jako výraz
const getTimestamp = () => Date.now();
const log = function(message, timestamp = getTimestamp()) {
console.log(`[${timestamp}] ${message}`);
};
log("Hello"); // → [1234567890] Hello (aktuální čas)
log("World"); // → [1234567891] World (další čas)
Co se stalo?
- Výchozí hodnota může být volání funkce!
- Funkce se volá pokaždé, když je parametr vynechán
- To je užitečné pro dynamické výchozí hodnoty
Příklad 5: Porovnání se starým způsobem
Starý způsob (před ES6):
function roundTo(n, step) {
if (step === undefined) {
step = 1; // Ruční kontrola
}
let remainder = n % step;
return n - remainder + (remainder < step / 2 ? 0 : step);
}
Nový způsob (ES6+):
function roundTo(n, step = 1) {
let remainder = n % step;
return n - remainder + (remainder < step / 2 ? 0 : step);
}
console.log(roundTo(4.5)); // → 5 (zaokrouhlí na 1) console.log(roundTo(4.5, 2)); // → 4 (zaokrouhlí na 2)
**Co se stalo?**
Nový způsob je **kratší a čitelnější**
Nemusíš psát `if` kontroly
Výchozí hodnota je **vidět hned v hlavičce funkce**
---
## TypeScript
V TypeScriptu můžeš kombinovat **typy** a **výchozí hodnoty**:
```ts
const greet = function(name: string, greeting: string = "Hello"): string {
return greeting + ", " + name + "!";
};
// TypeScript automaticky odvodí typ výchozí hodnoty
const roundTo = function(n: number, step = 1): number {
// ↑
// TypeScript ví, že step je number
let remainder = n % step;
return n - remainder + (remainder < step / 2 ? 0 : step);
};
Volitelné parametry (?) vs výchozí hodnoty (=):
// Volitelný parametr - může být undefined
const greet1 = function(name: string, greeting?: string): string {
if (greeting === undefined) {
greeting = "Hello"; // Musíš kontrolovat
}
return greeting + ", " + name;
};
// Výchozí hodnota - automaticky "Hello" pokud chybí
const greet2 = function(name: string, greeting: string = "Hello"): string {
return greeting + ", " + name; // Bez kontroly!
};
Nejlepší praxe:
- Pokud má parametr přirozenou výchozí hodnotu → použij
= - Pokud parametr může být undefined a nemá výchozí hodnotu → použij
?
TypeScript přidává:
- ✅ Kontrolu typů - výchozí hodnota musí odpovídat typu
- ✅ Odvození typů - pokud zapíšeš
= 1, TypeScript ví, že je to number - ✅ Bezpečnost - nemůžeš přiřadit špatný typ jako výchozí hodnotu
Rozdíl JS vs TS
JavaScript:
// JavaScript ti dovolí cokoli
const test = function(value = "default") {
return value.toUpperCase(); // Předpokládá, že value je string
};
test(); // "DEFAULT" ✅
test("hello"); // "HELLO" ✅
test(123); // 💥 Runtime error: value.toUpperCase is not a function
TypeScript:
const test = function(value: string = "default"): string {
return value.toUpperCase();
};
test(); // "DEFAULT" ✅
test("hello"); // "HELLO" ✅
test(123); // ❌ Compile error: Argument of type 'number' is not assignable to parameter of type 'string'
Tip
💡 Výchozí parametry na konci:
// ❌ Matoucí - výchozí parametr uprostřed
const bad = function(a = 1, b, c = 3) { };
// ✅ Dobře - výchozí parametry na konci
const good = function(a, b, c = 3, d = 4) { };
💡 Výchozí hodnoty by měly být jednoduché:
// ❌ Špatně - vedlejší efekt
let counter = 0;
const bad = function(x = counter++) { // Zvyšuje counter pokaždé!
return x;
};
// ✅ Dobře - jednoduchá hodnota
const good = function(x = 0) {
return x;
};
💡 Použij undefined pro vyvolání výchozí hodnoty:
const greet = (name, greeting = "Hello") => greeting + " " + name;
greet("Alice"); // "Hello Alice" ✅
greet("Alice", "Hi"); // "Hi Alice" ✅
greet("Alice", undefined);// "Hello Alice" ✅ (použije výchozí)
greet("Alice", null); // "null Alice" ❌ (použije null!)
Kvíz
Kdy se použije výchozí hodnota parametru?
✅ - Výchozí hodnota se použije POUZE když je argument undefined nebo vynechán
❌ - null je validní hodnota, použije se
❌ - 0 a "" jsou validní hodnoty, použijí se
❌ - Pokud předáš argument, použije se ten
🎯 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
- 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
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ě