04.03 Push, pop, shift, unshift
Výuka
Proč Push, pop, shift, unshift?
Tyto metody slouží k přidávání a odstraňování prvků z pole. Jsou to základní operace pro práci s dynamickými kolekcemi dat.
Proč to potřebujeme?
- Přidání prvku - Vložit nový prvek na začátek nebo konec pole
- Odebrání prvku - Odstranit prvek ze začátku nebo konce
- Fronta (Queue) -
push+shift= prvek dovnitř na konec, ven ze začátku - Zásobník (Stack) -
push+pop= prvek dovnitř na konec, ven z konce (LIFO)
Představ si to jako: Fronta lidí na zastávce. push přidá člověka na konec fronty, shift vyndá člověka ze začátku (ten, co čeká nejdéle). Nebo zásobník talířů - push přidá talíř navrch, pop odebere talíř z vrchu.
Jak to funguje?
1. push(...items) - přidá prvek(y) na KONEC pole, vrací novou délku (MUTUJE pole!)
2. pop() - odstraní poslední prvek, vrací ho (MUTUJE pole!)
3. shift() - odstraní první prvek, vrací ho (MUTUJE pole!)
4. unshift(...items) - přidá prvek(y) na ZAČÁTEK pole, vrací novou délku (MUTUJE pole!)
5. Všechny MĚNÍ původní pole (mutující metody)
Klíčové koncepty
push()- přidá prvek(y) na konec, vrací novoulengthpop()- odstraní poslední prvek, vrací odstraněný prvek (neboundefined)shift()- odstraní první prvek, vrací odstraněný prvek (neboundefined)unshift()- přidá prvek(y) na začátek, vrací novoulength- Mutující metody - mění původní pole (na rozdíl od např.
slice) - Stack (LIFO) - Last In, First Out - použij
push+pop - Queue (FIFO) - First In, First Out - použij
push+shift
JavaScript
Příklad 1: push() - přidání na konec
const fruits = ['jablko', 'banán'];
console.log(fruits);
// → ['jablko', 'banán']
// Přidej jeden prvek
const newLength = fruits.push('třešeň');
console.log(fruits);
// → ['jablko', 'banán', 'třešeň']
console.log(newLength);
// → 3 (nová délka pole)
// Přidej více prvků najednou
fruits.push('datle', 'hruška');
console.log(fruits);
// → ['jablko', 'banán', 'třešeň', 'datle', 'hruška']
Co se stalo?
push()přidá prvek na konec pole- Vrací novou délku pole (ne přidaný prvek!)
- Můžeš přidat více prvků najednou:
push(a, b, c) - MUTUJE původní pole - pole se změní!
Příklad 2: pop() - odebrání z konce
const numbers = [1, 2, 3, 4, 5];
console.log(numbers);
// → [1, 2, 3, 4, 5]
// Odeber poslední prvek
const last = numbers.pop();
console.log(last);
// → 5 (odebraný prvek)
console.log(numbers);
// → [1, 2, 3, 4] (pole se zkrátilo)
// Pop z prázdného pole
const empty = [];
const result = empty.pop();
console.log(result);
// → undefined (nic k odebrání)
Co se stalo?
pop()odstraní a vrátí poslední prvek- Pole se zkrátí o 1
- Pokud je pole prázdné, vrátí
undefined - MUTUJE původní pole
Příklad 3: shift() - odebrání ze začátku
const colors = ['červená', 'zelená', 'modrá', 'žlutá'];
console.log(colors);
// → ['červená', 'zelená', 'modrá', 'žlutá']
// Odeber první prvek
const first = colors.shift();
console.log(first);
// → červená (odebraný prvek)
console.log(colors);
// → ['zelená', 'modrá', 'žlutá']
// Všechny prvky se posunou doleva
console.log(colors[0]);
// → zelená (byl na indexu 1, teď je na 0)
Co se stalo?
shift()odstraní a vrátí první prvek- Všechny ostatní prvky se posunou o index dolů (index 1 → 0, index 2 → 1, atd.)
- Pole se zkrátí o 1
- Pozor:
shift()je pomalejší nežpop()(musí přeindexovat prvky)
Příklad 4: unshift() - přidání na začátek
const animals = ['pes', 'kočka'];
console.log(animals);
// → ['pes', 'kočka']
// Přidej na začátek
const newLength = animals.unshift('myš');
console.log(animals);
// → ['myš', 'pes', 'kočka']
console.log(newLength);
// → 3
// Přidej více prvků najednou
animals.unshift('pták', 'ryba');
console.log(animals);
// → ['pták', 'ryba', 'myš', 'pes', 'kočka']
Co se stalo?
unshift()přidá prvek(y) na začátek pole- Všechny existující prvky se posunou o index nahoru
- Vrací novou délku pole
- Pozor:
unshift()je pomalejší nežpush()(musí přeindexovat prvky)
Příklad 5: Stack (LIFO) - zásobník
// Zásobník - Last In, First Out
const stack = [];
// Přidávej prvky (push)
stack.push('první');
stack.push('druhý');
stack.push('třetí');
console.log(stack);
// → ['první', 'druhý', 'třetí']
// Odebírej prvky (pop) - v opačném pořadí
console.log(stack.pop()); // → třetí (poslední přidaný)
console.log(stack.pop()); // → druhý
console.log(stack.pop()); // → první
console.log(stack);
// → [] (prázdný zásobník)
Co se stalo?
- Stack = zásobník, pracuje jako talířová věž
pushpřidá prvek navrch,popodebere prvek z vrchu- LIFO (Last In, First Out) - poslední přidaný vyjde jako první
- Užitečné pro: zpět/vpřed v prohlížeči, undo/redo, parsování závorek
Příklad 6: Queue (FIFO) - fronta
// Fronta - First In, First Out
const queue = [];
// Přidávej prvky na konec (push)
queue.push('Alice');
queue.push('Bob');
queue.push('Charlie');
console.log(queue);
// → ['Alice', 'Bob', 'Charlie']
// Odebírej prvky ze začátku (shift) - v pořadí přidání
console.log(queue.shift()); // → Alice (první přidaný)
console.log(queue.shift()); // → Bob
console.log(queue);
// → ['Charlie']
Co se stalo?
- Queue = fronta, jako fronta v obchodě
pushpřidá na konec fronty,shiftodebere ze začátku- FIFO (First In, First Out) - první přidaný vyjde jako první
- Užitečné pro: zpracování úloh, event queue, buffering
TypeScript
TypeScript přidává typovou kontrolu - zkontroluje, že vkládáš prvky správného typu.
Stejné příklady s typy
// Push s typem
const fruits: string[] = ['jablko', 'banán'];
fruits.push('třešeň'); // ✅ OK - string
// fruits.push(123); // ❌ Error: Argument of type 'number' is not assignable to parameter of type 'string'
const newLength: number = fruits.push('datle'); // vrací number
// Pop s typem
const numbers: number[] = [1, 2, 3, 4, 5];
const last: number | undefined = numbers.pop(); // pop vrací T | undefined
console.log(last); // → 5
// Shift s typem
const colors: string[] = ['červená', 'zelená', 'modrá'];
const first: string | undefined = colors.shift();
// Unshift s typem
const animals: string[] = ['pes', 'kočka'];
animals.unshift('myš'); // ✅ OK
// animals.unshift(42); // ❌ Error
// Stack s typem
const stack: number[] = [];
stack.push(1, 2, 3);
const top: number | undefined = stack.pop();
// Queue s typem
const queue: string[] = [];
queue.push('Alice', 'Bob');
const next: string | undefined = queue.shift();
// Readonly pole - nelze měnit
const readonly: readonly string[] = ['a', 'b', 'c'];
// readonly.push('d'); // ❌ Error: Property 'push' does not exist on type 'readonly string[]'
// readonly.pop(); // ❌ Error
TypeScript přidává:
- ✅ Typovou kontrolu prvků - nemůžeš vložit špatný typ
- ✅ Správné typy návratových hodnot -
pop()ashift()vracejíT | undefined - ✅ Readonly kontrolu -
readonly T[]brání mutacím - ✅ IntelliSense - editor ti napovídá metody a typy
Rozdíl JS vs TS
JavaScript:
- Metody fungují bez typové kontroly
- Můžeš omylem přidat špatný typ prvku
- Návratová hodnota není explicitně typovaná
- Flexibilnější, ale nebezpečnější
TypeScript:
- Metody jsou typově kontrolované
- Nemůžeš přidat prvek špatného typu
pop()ashift()vracejíT | undefined- Bezpečnější, lépe dokumentované
// JavaScript - projde, ale může způsobit problém
const numbers = [1, 2, 3];
numbers.push('čtyři'); // OK v JS, ale problematické
console.log(numbers[3] * 2); // NaN!
// TypeScript - editor tě upozorní
const numbers: number[] = [1, 2, 3];
numbers.push('čtyři'); // ❌ Error: Argument of type 'string' is not assignable to parameter of type 'number'
Tip
💡 push/pop jsou rychlejší než unshift/shift:
// ✅ Rychlé - pracuje s koncem pole (O(1))
arr.push(x);
arr.pop();
// ⚠️ Pomalejší - musí přeindexovat všechny prvky (O(n))
arr.unshift(x); // posouvá všechny prvky doprava
arr.shift(); // posouvá všechny prvky doleva
// ✅ Pro velká pole preferuj push/pop
💡 Kontroluj prázdné pole před pop/shift:
const arr = [];
// ❌ Nekontroluje prázdné pole
const item = arr.pop(); // undefined
console.log(item.toUpperCase()); // Runtime error!
// ✅ Kontroluj před použitím
if (arr.length > 0) {
const item = arr.pop();
console.log(item);
} else {
console.log('Pole je prázdné');
}
💡 Stack vs Queue - kdy použít co:
// ✅ Stack (LIFO) - použij push + pop
// Pro: undo/redo, zpět/vpřed navigace, parsování
const stack = [];
stack.push(1);
stack.push(2);
stack.pop(); // → 2 (poslední přidaný)
// ✅ Queue (FIFO) - použij push + shift
// Pro: zpracování úloh, event queue, buffering
const queue = [];
queue.push('task1');
queue.push('task2');
queue.shift(); // → task1 (první přidaný)
Kvíz
Co vypíše tento kód?
const arr = [1, 2, 3];
arr.push(arr.shift());
console.log(arr);
❌ - Pole se změnilo
✅ - arr.shift() odebere první prvek (1) a vrátí ho. Pak arr.push(1) přidá 1 na konec. Výsledek: [2, 3] → [2, 3, 1]
❌ - shift odstraní prvek, takže délka je stále 3, ne 4
❌ - Chybné pořadí
Důležité: shift() vrací hodnotu, která se dá použít jako argument pro push() - toto "přesune" první prvek na konec!
Důležité: shift() vrací hodnotu, která se dá použít jako argument pro push() - toto "přesune" první prvek na konec!
🎯 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
- 04.01 Vytvoření pole
- 04.02 Přístup k prvkům
- 04.03 Push, pop, shift, unshift
- 04.04 Slice a splice
- 04.06 Filter
- 04.07 Reduce
- 04.08 Find a findIndex
- 04.09 Some a every
- 04.10 Sort
- 04.11 Spread operátor
- 04.12 Set
- 04.13 Map kolekce
- 04.14 Destructuring polí
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ě