Proč JavaScript a kde běží
JavaScript je univerzální, dynamicky typovaný jazyk, který běží v prohlížečích, na serveru (Node.js), v desktopových i mobilních aplikacích (Electron, React Native) a v prostředích edge runtimes (Cloudflare Workers, Deno). Vznikl pro interaktivitu webu, dnes však pokrývá celé spektrum vývoje. Standard jazyka udržuje organizace TC39 pod názvem ECMAScript (ES2015+ = moderní JS).
Jak se spouští kód a jak vypadá soubor
- V prohlížeči: vložte
<script type="module" src="/app.js"></script>do HTML. Atributtype="module"aktivuje moduly ES. - V Node.js: spusťte
node app.js. Chcete-li používat moduly ES, nastavte vpackage.jsonhodnotu"type": "module". - Přísný režim: začněte soubor direktivou
"use strict"(v modulech je aktivní implicitně), která zpřísňuje pravidla a eliminuje tiché chyby.
Proměnné: let, const, var a oblast platnosti
const– neměnná vazba (hodnotu nelze znovu přiřadit); ideální výchozí volba.let– proměnná s blokovou oblastí platnosti ({}), vhodná pro měnitelné hodnoty.var– má funkční oblast platnosti, hoisting může vést k chybám; v moderním kódu se nedoporučuje.- TDZ (Temporal Dead Zone): přístup k
let/constpřed deklarací vyvolá chybu.
Datové typy a práce s hodnotami
- Primitivní typy:
string,number(včetněNaNaInfinity),boolean,null,undefined,bigint,symbol. - Referenční typy:
object(včetněArray,Function,Date,Map,Set). - Kontrola typu:
typeof 42 === "number",Array.isArray([]). - Pravdivé/nepravdivé hodnoty: nepravdivé jsou
0,"",null,undefined,false,NaN. V podmínkách dávejte pozor na implicitní konverze.
Operátory: aritmetika, logika a porovnání
- Aritmetické:
+,-,*,/,%,**. Pozor:+slouží také ke zřetězení řetězců. - Porovnání: upřednostňujte striktní operátory
===a!==před==/!=, které provádějí volnou konverzi. - Logické:
&&,||,!a??(operátor nullish coalescing) pro hodnotynull/undefined. - Volitelné řetězení:
obj?.prop?.()umožňuje bezpečný přístup k hluboko vnořeným vlastnostem. - Destrukturalizace a spread:
const {a,b} = obj,const [x,...rest] = arr,const c = {...obj, k:1}.
Řídicí struktury: podmínky a cykly
- Podmínky:
if/else, ternární operátorcond ? A : B,switchpro větvení. - Cykly:
for,while,do...while. V moderním kódu používejtefor...ofpro iterovatelné struktury a metody políforEach,map,filter,reduce. - Iterace objektů:
Object.keys(),Object.entries()afor...in(s opatrností; pokud nejsou odfiltrovány, zahrnuje i vlastnosti zděděné z prototypů).
Funkce: deklarace, výrazy a šipkové funkce
- Deklarace:
function suma(a, b) { return a + b }– díky hoistingu lze funkci volat ještě před její deklarací. - Funkční výraz:
const suma = function(a, b) { return a + b }– funkce je přiřazena do proměnné. - Šipková funkce:
const suma = (a, b) => a + b– má lexikálníthisa nevytváří vlastníargumentsaniprototype. - Výchozí a zbytkové parametry:
function f(a = 1, ...rest) {}. - Čisté funkce: snadněji se testují a nemají vedlejší efekty.
Objekty a prototypy, třídy a dědičnost
- Objektový literál:
const p = { jméno: "Eva", věk: 33 }; zkrácený zápis{ jméno, věk }a počítané klíče{[klíč]: hodnota}. - Prototypový model: každý objekt má prototyp; metody se sdílejí prostřednictvím prototypového řetězce.
- Třídy (syntaktický cukr):
class Osoba { constructor(jméno){ this.jméno=jméno } pozdrav(){ return `Ahoj, ${this.jméno}` } }. - Dědičnost:
class Zaměstnanec extends Osoba { constructor(jméno, role){ super(jméno); this.role=role } }.
this, call/apply/bind a běhový kontext
- Hodnota
this: závisí na způsobu volání (metoda, volná funkce, konstruktor, obsluha události). Šipková funkce přebíráthisz okolního kontextu a jeho hodnota se dynamicky nemění. - Opětovné svázání:
funkce.call(ctx, a, b),funkce.apply(ctx, [a, b]),funkce.bind(ctx)pro trvalé svázání.
Moduly: import a export
- Pojmenovaný export:
export const PI = 3.14,export function kruh(). - Výchozí export:
export default function hlavní(){}. - Import:
import hlavní, { PI } from "./modul.js". Moduly se načítají asynchronně a vyhodnocují se pouze jednou.
Asynchronní JavaScript: callbacky, Promise a async/await
- Promise: představuje budoucí hodnotu;
fetch("/data").then(r => r.json()). async/await: syntaktický cukr nad Promise;const data = await fetch(url).then(r => r.json()). Chyby vždy zachytávejte pomocítry...catch.- Paralelní zpracování:
const [a,b] = await Promise.all([pa(), pb()])umožňuje souběžné provedení. - Event loop a mikroúlohy/makroúlohy: callbacky Promise (mikroúlohy) mají přednost před
setTimeout(makroúlohou).
Základy práce s DOM a událostmi
- Selektory:
document.querySelector("#btn"),document.querySelectorAll(".item"). - Manipulace:
el.textContent = "Ahoj",el.classList.add("active"),el.setAttribute("role","button"). - Události:
el.addEventListener("click", (e) => { e.preventDefault() }). Delegaci lze řešit prostřednictvím rodičovského prvku a kontroly pomocíe.target.matches(). - Přístupnost: vždy zohledněte pořadí při procházení klávesou Tab, správu fokusu a role ARIA.
Chyby a výjimky: try...catch, throw, Error
- Zachycení:
try { risk() } catch (err) { console.error(err.message) } finally { cleanup() }. - Vlastní chyby:
throw new Error("Neplatný vstup"); v asynchronních funkcích kombinujte sawait. - Doplnění kontextu: přidejte
causenebo použijte vlastní typy chyb.
Čistý kód: linting, formátování a konvence
- Linting: ESLint s pravidly (no-undef, eqeqeq, no-var, prefer-const).
- Formátování: Prettier pro jednotný styl; integrujte jej do CI.
- Konvence: camelCase pro proměnné, PascalCase pro třídy, UPPER_CASE pro konstanty.
Časté nástrahy a jak se jim vyhnout
- Volná rovnost:
==provádí nečekané konverze (např."" == 0jetrue); používejte===. - Mutace objektů/polí: upřednostňujte neměnný přístup – vytvářejte kopie pomocí spreadu
{...o},[...a]. - Hoisting
var: vyhýbejte sevar, používejtelet/const. - Neošetřené Promise: Promise vždy vraťte nebo použijte
await; nezapomeňte zachytit chyby. - Úniky do globálního prostoru: deklarace bez
let/constvytváří globální proměnné (v přísném režimu vyvolá chybu).
Mini kuchařka: drobné idiomy a vzory
- Bezpečný přístup:
const město = uživatel?.adresa?.město ?? "neznámé". - Výchozí parametry:
function greet(jméno = "host") { return `Ahoj, ${jméno}` }. - Destrukturalizace parametrů:
function render({id, title}) {}zvyšuje čitelnost. - Mapování a filtrování:
const aktivní = items.filter(i => i.enabled).map(i => i.name).
Výkon a osvědčené postupy
- Debounce/throttle u událostí scroll/resize/input, abyste snížili počet volání obslužných rutin.
- Dávkové změny DOM – upřednostňujte jedno vložení většího fragmentu před mnoha drobnými operacemi.
- Memoizace pro nákladné výpočty; v knihovnách pro UI používejte specializované nástroje.
Jak pokračovat v učení: standard, nástroje a ekosystém
- Návrhy ECMAScriptu: sledujte fáze procesu TC39, abyste se vyznali v novinkách (records/tuples, pattern matching apod.).
- Nástroje: Node.js + npm/pnpm, nástroje pro sestavování (Vite, esbuild), testování (Jest, Vitest), typování (TypeScript) – přestože není součástí JS, velmi pomáhá.
- Rozhraní API prohlížeče: Fetch, Web Storage, Web Components, Canvas, Web Workers – rozšiřují možnosti běhového prostředí.
Závěr: pevné základy pro moderní vývoj
Ovládnutí základní syntaxe JavaScriptu – proměnných, typů, funkcí, objektů, modulů a asynchronního modelu – je předpokladem pro práci s jakýmkoli frameworkem či platformou. Držte se striktního porovnávání, používejte let/const, vyhýbejte se zbytečným mutacím a pište testovatelný, čitelný kód. Díky těmto principům budete moci bezpečně využívat bohatý ekosystém moderního JavaScriptu.
