JavaScript

DVOP WBB


Bc. Matěj Cajthaml — SSPŠ

©

JavaScript

  • skriptovací jazyk
  • pomocí Node.js začíná být programovacím
  • více jak 20 let starý
  • vytvořen pro webové stránky

Divné věci v JavaScriptu vytváří autor a používá zakázané konstrukce jazyka.

Zpětná kompabilita

  • většina divných věcí v JS zbyla po prvních verzí
  • zrušit zpětnou kompabilitu by bylo velmi těžké
  • JS se rozvijí a není potřeba tyto konstrukce používat
  • my se jim budeme vyhybat a nebudeme je používat

https://jsisweird.com

https://github.com/denysdovhan/wtfjs

JavaScript nemá nic společného s Javou.

Práce s JS

  • při programování se musí přemýšlet trošku jinak
  • jako všechny dovednosti — potřebuje čas a praxi
  • JS nepoužívá datové typy, pouze interně

Node.js

Node.js

  • systém pro psaní aplikací
  • JavaScript na serveru / v konzolové řádce
  • komplexní systém
  • alfa-omega celého DVOPu

V Node.js máme k dispozici vše z našeho známého JS (bez DOMu a spojených věcí) a dokonce věci na více (práce se soubory, ...).

https://nodejs.org/en/

Ukázka použití

  • příkaz node

npm

npm

  • balíčkovací systém
  • pro Node.js
  • balíček = knihovna = library, ...

Balíčky

  • instalujeme jako projekt
  • instalujeme globálně (různé správce)
  • 1.3 milionu balíčků zaregistrováno

package.json

  • ukládání informací o projektu
  • seznam knihoven, jejich verze
  • příkazy a další nastavení

npm

  • npm se instaluje společně s Node.js

https://www.npmjs.com

JS kód pomocí Node.js spouštíme v příkazové řádce pomocí příkazu node soubor.js.

Zápis

Zápis

  • ve stránce píšeme v tagu script jako poslední blok před ukončovacím tagem body
  • ve stránce můžeme importovat pomocí tagu script a atributu src
  • v konzolové řádce tvoříme pouze soubor, který spouštíme

Komentáře

Proměnné

Proměnné

  • způsob uložení dat
  • dva typy: konstanty a proměnné
  • vždy určujeme jméno
  • jméno: vždy anglicky, unikátní, přesné a s jasným významem

Za každým příkazem používáme středník. Že?

Příkaz vytvoření proměnné

Během běhu můžeme měnit proměnným datový typ i jejich hodnotu.

Textovou hodnotu píšeme do uvozovek.

""

Hodnota undefined říká, že daná proměnná nemá určenou hodnotu.

Co říká hodnota null?

Pravidost se v JS reprezentuje boolean hodnoty true a false.

Textové hodnoty

Práce s textovými hodnotami

  • hodnoty můžeme spojovat pomocí +
  • získat délku pomocí .length
  • znak pomocí charAt(k) na k-té pozici
  • zda obsahuje hodnotu pomocí .includes(str)
  • zvětšení písmen pomocí .toUpperCase()
  • zmenšení písmen pomocí .toLowerCase()
  • porovnat pomocí operátoru ==

Čísla

Práce s čísly

  • čísla můžeme sčítat (+), odečítat (-), dělit (/) a násobit (*)
  • porovnání pomocí ==, <, >, <=, >=

Větvení

Podmínky

  • zápis pomocí klíčového slova if
  • přijímá boolean hodnotu a pokud je platná, zavolá se příslušný blok
  • else if — nebo a pokud (lze používat neomezeně krát)
  • else — nebo, poslední část bloku

Pomocí console přistupujeme do konzole (jako v konz. řádce tak na webu).

Pomocí console.log(smth) vypíšeme něco do konzole. Existují další metody?

Logické operátory

Striktní vs. obyčejné porovnání

  • striktní: ===
  • obyčejné: ==
  • striktní porovnává datový typ a hodnotu
  • obyčejné porovnává jen hodnoty převedné na číslo
  • negace: !== a !=

"2021" === 2021?

"2021" === "2021"?

"2021" == "2021"?

"2021" == 2021?

Další porovnání

  • >
  • <
  • <=
  • >=

Spojování booleanových hodnot

  • && — a zároveň
  • || — a nebo
  • ! — negace

Závorky usměrnují pořadí operací.

Jednořádková podmínka

tzv. tenární operátor

Řídící konstrukce

Přepínač — switch

  • chytřejší podmínky
  • hodí se na menší počet podmínek — hodnot
  • podobné hodnoty
  • klíčová slova: switch, case, break, default
  • striktní porovnání

Přepínač — switch

Cyklus dokuď — while

  • blok s příkazy se provádí dokuď je podmínka pravdivá
  • můžeme využívat proměnné
  • lze vytvořit nekonečný cyklus

Cyklus dokuď — while

Cyklus s proměnou — for

  • blok s příkazy se provádí dle zadaných částí
  • tři části: proměnná, podmínka a inkrementátor
  • lze vytvořit nekonečný cyklus

Cyklus s proměnou — for

Čtení argumentů

Čtení argumentů

  • když spustíme program pomocí prostředí Node.js
  • zadáváme argumenty
  • ty můžeme číst pomocí process.argv

Ukázka

Objekty

Objekty

  • způsob uložení dat programu
  • jedná se o pár jméno—hodnota
  • hodnota může být cokoliv — klidně i další objekt
  • podobá se Dictionary z C#
  • lze procházet cykly

Ukázka objektů

Přístup

Procházení

Pole

Pole

  • způsob uložení dat programu
  • stejně jako proměnné se ukládá v operační paměti
  • v JS: nemá pevně stanovenou velikost
  • v JS: nemá pevně stanovený datový typ
  • lze procházet cykly

Vytvoření

Přidávání

Čtení

Velikost

Pomocné metody

Hledání — find a filter

Přemapování — map

Procházení

Jak funguje pomocná metoda pro pole redukcereduce?

Funkce

Funkce

  • černá krabička
  • zpracovává vstup (parametry) a vrací nějakou hodnotu
  • klíčová slova: function, return
  • můžeme definovat globálně nebo do proměnné

Ukázka

Math

Zpoždění

  • daná funkce se spustí o daný počet milisekund pouzději
  • setTimeout

Opakování

  • daná funkce se bude opakovat po daném počtu milisekund
  • setInterval

Návratovou hodnotou metod setTimeout a setInterval je číslo daného zpoždění/opakování. Oba dva můžeme zastavit pomocí tohoto čísla — jak?

https://developer.mozilla.org/en-US/docs/Web/JavaScript

Objekt

  • uložení více dat různých datových typů na jednom místě
  • tvoříme pomocí složených závorek

Můžeme mít v objektu funkci?

Jak se taková funkce bude volat?

Třída

  • nějaká šablona určitého jména
  • vytváříme instanci — určitý objekt, který kopíruje šablonu
  • šablona nám určuje proměnné — vlastností, které bude instance vždy obsahovat
  • určuje taktéž funkce — metody, které zajisté budeme moci volat na instanci

Třídy jsou tedy takové objekty, ne? Proč tedy třídy používáme?

Třídy nám zaručí jakousi konzistenci dat.

Kód rozdělujeme do více celků, které se lépe zpracovávájí.

Nemusíme opakovat ten samý kód.

Definice tříd

Co to vypíše?

Definice metod

Přístup k hodnotám

Komplexní přístup

Metody s parametry

Konstruktor

Konstruktor

  • speciální metoda
  • je přitomný i když jej nedefinujeme
  • slouží k připravení instance k použití
  • např. hodnoty, které musí být přítomny, různé zpracování, načtení servis

Ukázka

Promises

Co to znamená promise?

Aktuální kód

  • běží synchronně — za sebou
  • než se provede další příkaz, musí se provést ten před ním
  • nereálné v produkčním prostředí — nemůžeme čekat než se něco stane

Na co na webových stránkách musíme čekat v kódu?

Promises

  • způsob vytvoření asynchronního kódu
  • akce trvají různě dlouho
  • neblokují se další příkazy, které na daném výsledku nezávisí
  • ty, co jsou na sobě závislé čekají

then

  • funkce se zavolá s hodnotou poté, co se promises vyřeší
  • můžeme nastavit i vícekrát — řetízkují se

Jak si myslíte, že bude implementovaná funkce generateCatName?

Náhodné kočky

Společná práce

Vytvořte funkci, která Vám vrátí promise, která po 1 vteřině vrátí objekt s náhodným jménem kočky, náhodným věkem kočky a náhodnou barvou.

Funkci zavolejte a vypište obsah objektu, který Vám přijde.

Někdy se může stát, že se operace neprovede.

Co se závislostmi Promise stane?

Odmítnutí v kódu

Zachycení chyb uvnitř promise

  • pomocí volání .catch, která zachytí všechny chyby
  • zachytí chyby před tím a zavolají nějaký kód
  • volání .then po zavoláni .catch se zavolají i přes chybu
  • proto často dáváme .catch až na konec

Garance

  • funkce přidávány pomocí .then budou volány v přesném pořadí a až potom (a jen když) bude předchozí funkce úspěšně splněna
  • funkce přidávány pomocí .then budou zavolány i po tom, co byly přidány již na vyřešenou promise

Volání promises

  • .all — zavolání všech najednou a najednou získá jejich data
  • .race — zavolání všech najednou, vrátí první

Náhodné kočky 2

Společná práce

Již máme vytvořenou funkci s promise na vrácení náhodné kočky.

Nyní pomocí promise udělejte, že se vrátí jedna kočka a po získání kočky se získá druha kočka (bude trvat sekundu) a takto desetkrát.

Asynchronní funkce

Asynchronní funkce

  • používání promises je velmi logicky náročné
  • využívají se stále ty samé konstrukce dokola
  • proto byl přidán syntax sugar pro asynchronní funkce
  • klíčové slovo async a await

async

  • říká, že je funkce asynchronní
  • vždy vrací promise
  • na tu se můžeme vázat
  • uvnitř používáme await

await

  • řiká, že na daný přikaz se musí počkat k pokračování

TypeScript

TypeScript

  • preprocessor
  • má k dispozici vše v JS
  • na více type system
  • tj. datové typy, více OOP, ...
  • nad rámec toho předmětu

https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html

Propojování souborů

Proč bychom potřebovali propojovat soubory?

Propojování souborů

  • často potřebujeme propojit více souborů dohromady
  • přehledný kód
  • modularita, skvělé pro OOP

require(path)

  • vloží do proměnné exportovaný obsah z jiného souboru
  • provede veškeré příkazy v souboru

data.js

require.js

Moderní import/export

Práce

Zjistěte si, jak se moderně importují a exportují části z JS souborů

https://javascript.info/import-export

Co je to Node.js?

npm

  • balíčkovací systém
  • pro Node.js
  • baliček = knihovna = library, ...

balíčky

  • instalujeme jako projekt
  • instalujeme globálně
  • 1.3 milionu balíčků zaregistrováno

package.json

  • ukládání informací o projektu
  • seznam knihoven, jejich verze
  • příkazy a další nastavení

npm

  • npm se instaluje společně s Node.js

Založíme projekt!

npm init

npm init

  • interaktivní příkaz
  • založení projektu
  • dle zadaných informací vygeneruje package.json

npm run compile

npm run run

Balíčky

Instalace

  • nyní budeme instalovat pro projekt
  • npm install <jmeno balíčku>

Po instalaci

  • upraví/vytvoří se složka node_modules, obsahující dané knihovny
  • upraví se soubor package.json — bude obsahovat knihovnu a její verzi
  • upraví/vytvoří se soubor package-lock.json, který obsahuje přesnější informace o nainstalovaných knihovnách

Soubor package-lock.json a node_modules nikdy nedáváme na verzovací systém (git).

Každý balíček / knihovna se chová různě. Vždy je potřeba číst dokumentaci.

Balíčky

Práce

Prohledejte internet a nalezněte zajimavé (možná i zvláštní) npm balíčky.

Děkuji za pozornost!

  • matej.cajthaml@ssps.cz
  • https://ssps.cajthaml.eu/