2.3 Ternární operátor
Výuka
Co je ternární operátor?
Ternární operátor je zkrácený zápis jednoduchého if/else na jeden řádek. Jmenuje se "ternární", protože má 3 části (operandy).
podmínka ? hodnotaKdyžTrue : hodnotaKdyžFalse
Kdy ho použít?
✅ Vhodné:
- Jednoduché přiřazení hodnoty podle podmínky
- Krátké, čitelné výrazy
- Inline v JSX/template literals
❌ Nevhodné:
- Složitá logika s více příkazy
- Vnořené ternární operátory (těžko čitelné)
- Když potřebuješ vedlejší efekty (console.log, API calls)
Proč existuje?
Představ si, že chceš přiřadit text podle podmínky:
// Klasický if/else - 5 řádků
let message;
if (isLoggedIn) {
message = "Vítej zpět!";
} else {
message = "Přihlaš se";
}
// Ternární operátor - 1 řádek
const message = isLoggedIn ? "Vítej zpět!" : "Přihlaš se";
Ternární operátor je výraz (vrací hodnotu), zatímco if/else je příkaz (nevrací hodnotu).
JavaScript
// Základní použití
const age = 20;
const status = age >= 18 ? "dospělý" : "nezletilý";
console.log(status); // "dospělý"
// Přiřazení s podmínkou
const score = 85;
const grade = score >= 90 ? "A" : score >= 80 ? "B" : "C";
// ⚠️ Vnořené ternární - radši nepoužívat
// V template literals
const user = { name: "Jan", isVIP: true };
console.log(`Uživatel: ${user.name} ${user.isVIP ? "(VIP)" : ""}`);
// "Uživatel: Jan (VIP)"
// Default hodnoty
const input = null;
const value = input ? input : "výchozí";
// nebo lépe: const value = input || "výchozí";
// nebo nejlépe: const value = input ?? "výchozí";
// V return příkazech
function getDiscount(isVIP) {
return isVIP ? 0.2 : 0;
}
// V argumentech funkcí
function greet(name) {
console.log(`Ahoj, ${name ? name : "cizinče"}!`);
}
greet("Jan"); // "Ahoj, Jan!"
greet(null); // "Ahoj, cizinče!"
// Volání různých funkcí
const isAdmin = true;
isAdmin ? showAdminPanel() : showUserPanel();
// ⚠️ Funguje, ale if/else je čitelnější pro akce
// V polích a objektech
const items = [
"položka 1",
condition ? "podmíněná položka" : null,
"položka 2"
].filter(Boolean); // Odstraní null
const config = {
debug: isDevelopment ? true : false,
// lépe: debug: isDevelopment
};
TypeScript
// TS odvozuje typ z obou větví
const age: number = 20;
const status = age >= 18 ? "dospělý" : "nezletilý";
// status: string
// Různé typy ve větvích
const value = Math.random() > 0.5 ? "text" : 42;
// value: string | number
// Explicitní typování
const result: string = score >= 50 ? "pass" : "fail";
// V generických funkcích
function getValue<T>(condition: boolean, trueVal: T, falseVal: T): T {
return condition ? trueVal : falseVal;
}
const num = getValue(true, 10, 20); // num: number
// S null/undefined
interface User {
name: string;
nickname?: string;
}
function getDisplayName(user: User): string {
return user.nickname ? user.nickname : user.name;
// nebo: return user.nickname ?? user.name;
}
// V React/JSX (ukázka syntaxe)
/*
function Greeting({ isLoggedIn }: { isLoggedIn: boolean }) {
return (
<div>
{isLoggedIn ? <UserPanel /> : <LoginButton />}
</div>
);
}
*/
// Type narrowing nefunguje v ternárním operátoru tak dobře
function example(value: string | null) {
// ❌ Ternární - TS neví, že value není null ve větvi
const upper = value ? value.toUpperCase() : "default";
// ✅ If/else - TS správně zužuje typ
let result: string;
if (value) {
result = value.toUpperCase(); // value: string
} else {
result = "default";
}
}
Rozdíl JS vs TS
| JavaScript | TypeScript |
|---|---|
| Žádná kontrola typů | TS odvozuje typ z obou větví |
| Větve mohou vracet cokoliv | Union type pokud větve mají různé typy |
| Žádné varování | TS varuje při nekompatibilních typech |
// TypeScript odvozuje union type
const result = condition ? "text" : 123;
// result: string | number
// Můžeš vynutit jeden typ
const result: string = condition ? "ano" : "ne";
// ✅ Obě větve musí být string
// const result: string = condition ? "ano" : 123;
// ❌ Error: Type 'number' is not assignable to type 'string'
Tip
💡 Nepoužívej vnořené ternární operátory:
// ❌ Nečitelné
const grade = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : "F";
// ✅ Čitelné - použij if/else nebo switch
let grade;
if (score >= 90) grade = "A";
else if (score >= 80) grade = "B";
else if (score >= 70) grade = "C";
else grade = "F";
💡 Pro default hodnoty radši použij ?? nebo ||:
// ❌ Zbytečně složité
const name = inputName ? inputName : "Anonymous";
// ✅ Jednodušší
const name = inputName || "Anonymous";
// ✅ Nejlepší (jen null/undefined)
const name = inputName ?? "Anonymous";
💡 Ternární je výraz - využij to:
// Můžeš ho použít všude, kde je očekáván výraz
console.log(`Status: ${isActive ? "aktivní" : "neaktivní"}`);
// V objektech
const user = {
role: isAdmin ? "admin" : "user",
theme: prefersDark ? "dark" : "light"
};
// V polích
const classes = ["button", isActive ? "active" : "inactive"];
Kvíz
Které výroky jsou pravdivé?
❌ - Ternární má 3 operandy: podmínka, hodnota pro true, hodnota pro false
✅ - Ternární je výraz, který vrací hodnotu (na rozdíl od if/else příkazu)
❌ - Pro složitou logiku a vedlejší efekty je lepší if/else
✅ - Pokud větve mají různé typy, TS vytvoří union type (např. string | number)
🎯 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ě