KAJ 1
Úvod, JavaScript pro začátečníky
Obsah
- O předmětu
- Standardy HTML a JS
- Syntaktické prvky JS
- Modularizace
Co jsou JavaScriptové aplikace?
Představení předmětu
- "Moderní" webové technologie na klientu
- HTML5, CSS3, JavaScript

Organizace
- Zkouška
- Semestrální práce
- Přednášky: RNDr. Ondřej Žára, Seznam.cz
- Cvičení: Bc. Zdeněk Vlach, Seznam.cz
- Cvičení: Bc. Petr Huřťák,
Seznam.cz
- Cvičení: Ing. Jan Dušek, Seznam.cz
Sylabus předmětu

Web předmětu
- Stránky předmětu na cvut.seznam.cz
- (Nové) pořadí témat: JS, síť, CSS, multimédia
Podklady a materiály
Kniha

- JavaScript: řešené úlohy
- Vydává Česká technika
- Kniha pro širší odbornou veřejnost
- Objem nápadně podobný předmětu KAJ
- Pozor na starou (2014) knihu
- JavaScript: Programátorské techniky a webové technologie
- Dnešní optikou zastaralá
Formalizace témat
- HTML/CSS: HTML5
- JavaScript: ECMAScript
Standard HTML5
https://html.spec.whatwg.org/
+
(Web Hypertext Application Technology Working Group)
- Mnoho rozdílných požadavků na standard:
- Zpětná kompatibilita
- Zpracování chyb
- Jednoduchost použití
- Podpora pro skriptování
Standardizační proces HTML
- Editor Ian Hickson
- Aktuálně
Working Draft Recommendation
- Living standard
- přes 14 MB textu, 95k řádek
- Vývoj pomocí mailinglistu whatwg@whatwg.org
- Dozorčí rada (WHATWG members)
- 2004 –
2022 2014

Standard ECMAScript
- Zaštiťuje TC39
- Návrhy na vylepšení může podat kdokoliv
- Konkrétní návrh prochází čtyřmi fázemi standardizace (s pomocí tzv. šampiona)
- Valná většina novinek přidávaných v posledních letech vzešla z požadavků a nápadů vývojářů
Webové prohlížeče: co kdo umí
JavaScript
- Interpret v každém prohlížeči
- Pro nováčka obtížný
- Jazyk samotný vs. DOM
- Některé koncepty nezvyklé optikou jiných programovacích jazyků (
this
, prototype
)
Syntaxe JS
- ...se v čase mění!
- Archaické období: 1995-2015
- Moderní období: 2015+
- Duální označení startuje s ES2015 = ES6
Console API
Vývojářské nástroje v každém prohlížeči (typicky F12)
console.log("...")
console.log("test", 123, ["pole", "hodnot"])
console.log("Formatovani %s", "retezcu")
console.warn("warning")
console.error("crash")
console.time("test")
console.timeEnd("test")
Více info v kompletní dokumentaci.
Definice proměnných
- var = archaické období
- let = var + block scope
- const = let + read-only
const N = 8
N = 4
const M = [1, 2, 3]
M.push(4)
let x = 1
if (true) { let x = 2 }
alert(x)
Základní syntaktické prvky
- ASI = Automatic Semicolon Insertion
- velmi komplikovaná pravidla!
- if, for, while, switch
- Type coercion
let a = 1 + "dva"
let b = {} + {}
if (0 == "") { }
if (undefined == null) { }
if (undefined === null) { }
Primitivní datové typy
- Číslo, bool, řetězec, null, undefined
- Předávané hodnotou
let a = 3
let b = 0.1 + 0.2
let c = "ahoj" + 'ahoj'
let e = null
let f = undefined
Template string literals
- Nahrazování řetězců
- Odpadá nutnost sčítání
- Smí obsahovat newline
- Možnost vlastní interpolační funkce
let x = "world"
let y = `hello ${x}`
let z = `this is a
very long string`
html`<div> ${unsafe} </div>`
randomize`Hello, ${["mr", "ms", "mrs"]}. ${firstnames} ${lastnames}`
Komplexní datové typy
- Objekt = neuspořádaná množina dvojic (klíč, hodnota)
- Podobjekty: Array, Function, Date, RegExp
- Předávané odkazem
let a = {}
let b = {c:3, "d":"hi"}
let e = [a, b]
let f = function() {}
let g = /^.*/
{Weak,}{Map,Set} {}
- Set: množina unikátních hodnot
- Map: dvojice cokoliv-cokoliv
- WeakMap, WeakSet: bez reference na objekt, bez iterovatelnosti
let s = new Set()
s.add("hello").add("goodbye").add("hello")
s.size == 2
s.has("hello") == true
let m = new Map()
m.set("hello", 42)
m.set(s, 34)
m.get(s) == 34
Objekty, funkce a pole
- Objekt = neuspořádaná množina dvojic
- Klíč je řetězec, hodnota je cokoliv
- Pole je též objekt
let pole1 = [3, 2, 1]
let pole2 = []
pole1.length == 3
pole1[1] == 2
pole2.length == 0
pole2.push(pole1)
Enhanced object literals
- Zkrácená definice objektů ex nihilo
let x = 42
let obj = {
x,
y() { return x; },
["data_" + x]: x
}
Destructuring
- Snazší přístup k vlastnostem struktur a polí
let [a, b, c] = [1, 2, 3]
let f = function() { return {x:42} }
let { x } = f()
Funkce
- Dva téměř ekvivalentní zápisy
function f1(a, b) { return a+b }
let f2 = function(a, b) { return a+b }
let add = function(a, b) { return a+b }
add.c = 123
add(add.c, add["c"])
Default + Rest + Spread
- Výchozí hodnoty parametrů
- Převod (podmnožiny) parametrů na pole a zpět
function f(x, y = 12) {
return x + y
}
f(10)
function f(x, ...y) {
alert(y.length)
}
f(1, 2, 3)
function f(a, b, c) { return c }
f(...[1, 2, 3])
Spread v akci
function build(data) {
let node = document.createElement("p")
node.classList.add(data.status)
node.append(data.text)
return node
}
const DATA = []
parent.append(...DATA.map(build))
Arrow functions
- Zkrácená syntaxe definice funkcí
- Lexical this (nelze
call, apply, new
)
this
v rámci arrow function nemá speciální hodnotu
- Pokud má tělo funkce jediný příkaz, není třeba
return
ani závorky
- Velmi výhodné pro funkcionální iteraci a posluchače událostí (3. a 4. přednáška)
let square = a => a*a
let add = (a, b) => a+b
setTimeout( () => this.doStuff(), 1000 )
Classes
class B extends A {
constructor(x) {
super()
this.x = x
}
static f2() {}
get something() { }
f1() {
super.f1()
return this.x
}
}
Jak pracovat s moderní syntaxí?
- Compatibility table
- Některou syntaxi lze transpilovat
- Více o tom za malou chvíli
- Pro něco lze polyfill (
Array.from
, Promise
, …)
- Více o tom v příští přednášce
- Něco nelze vůbec (
WeakMap, WeakSet, Proxy, SharedArrayBuffer
)
Transpilace ES 2015+
Babel v praxi
- Online hřiště na https://babeljs.io/repl
- Ke stažení jako npm modul
- Ke stažení též jako ohromný kus ES5 (transformace za běhu)
Strukturování kódu
Předpoklad: kód členíme do více malých souborů
Modularizace \ Počet |
Mnoho souborů |
Jeden soubor |
globální proměnné |
volitelně IIFE |
hloupý bundler |
import+export |
module script <script type=module> |
module-aware bundler |
IIFE
- Řešení z archaického období
- Více HTML značek
<script>
sdílí jmenný prostor
- Riziko kolize (v rámci aplikace i napříč dalšími skripty na stránce)
- Trik: immediately-invoked function expressions
IIFE
(function(){
let document = "test"
alert(document)
})();
alert(document)
ES Modules
- Modularizace na syntaktické úrovni
- Jeden výchozí a libovolně dalších pojmenovaných exportů
export let A = function() {}
export default function() {}
import { A } from "./a.js"
A()
import myLocalName from "./a.js"
Moduly v praxi
- Explicitní opt-in pomocí atributu
type
<script type="module" src="app.js"></script>
- automaticky v režimu defer (vykonání až po zpracování veškerého HTML)
- volitelně atribut async (vykonání paralelně se zpracováním HTML)
- Nutnost výdeje pomocí HTTP
- ✘ file://
- ✔ http://localhost
Bundling
- Výdej produkčního kódu – počet HTTP požadavků?
- Alternativa #1: neřešit (pro potřeby KAJ zcela dostačující)
- Alternativa #2: bundling do jednoho souboru, např. nástrojem Rollup či ESbuild
Prostor pro otázky
?