Prečo JavaScript
JavaScript je mimoriadne perspektívny a populárny jazyk.
- Je to hlavný programovací jazyk pre vývoj na webe. Všetky moderné webové prehliadače podporujú JavaScript.
- Podporuje vývoj na všetkých platformách:
- appky pre mobilné zariadenia, napr. cez React Native.
- serverové aplikácie, napr. cez Node.js
- desktopové aplikácie, napr. cez Electron
Čo je vlastne JavaScript?
JavaScript má rozličné verzie a pomenovania.
- norma ECMAScript 2015 alias ES6. Moderná syntax, podporovaný v takmer všetkých moderných prehliadačoch.
- norma ECMAScript 3.0. Staršia, menej pohodlná syntax. Podporovaná aj v pravekých prehliadačoch.
- JavaScript. Voľné pomenovanie “toho-jazyka, v ktorom sa robia weby”, obvykle sa tým myslí stará známa rozšírená ECMAScript 3.0.
V čom vyvíjať?
- Hračkárske programy sa dajú písať priamo na stránke JSFiddle.net.
- alebo sa dá zvoliť ľubovoľné IDE:
- skvelý platený WebStorm
- Visual Studio Code
- platený editor Sublime
- editor Atom implementovaný v JavaSCripte
Hrajkáme sa v prehliadači
Hello World
-
Otvorme si si JSFiddle.net.
-
Otvorme si webový prehliadač, a klávesovou skratkou F12 vyvolajme okno Vývojárskych nástrojov (Developer Tools). V nich si zobrazme Console (konzolu)
-
Spusťme prvý program:
console.log("Old McDonald had a farm"); -
JavaScript podporuje objektovo orientovaný prístup
- Premenná
consoleje objekt s metódoulog(). - Parametrom je reťazec v úvodzovkách Povolené sú aj apostrofy:
'Old McDonald had a farm' - Riadok sa končí bodkočiarkou (ale nie je to povinné).
- Premenná
Premenné
JavaScript deklaruje premenné pomocou let. Dátové typy sa neuvádzajú.
let song = "Old McDonald had a farm. I-a-i-a-oh";
Premenná na pozadí má typ reťazec (String).
Reťazce
Reťazce môžu byť uvádzané v "úvodzovkách" alebo 'apostrofoch'.
Pre niektoré prípady je ešte alternatíva zvaná template literal, ktorá podporuje viacriadkové reťazce. Takýto reťazec je oddelený pomocou spätných úvodzoviek (backticks).
let song = `Old McDonald had a farm
I-a-i-a-oh`;
Viacriadkové reťazce tak nemusíme lepiť / konkatenovať pomocou +.
Užitočná môže byť aj interpolácia premenných:
let animal = "cow";
let song = `Old McDonald had a farm. And on his farm he had some ${animal}`.
V premennej song máme odkaz na premennú animal, uzavretú v dolári a zložených
zátvorkách, ktorá sa nahradí jej obsahom.
Polia
let animals = [ "cow", "pig", "t-rex" ];
Položky polí sú v hranatých zátvorkách. Pristupovať k jednotlivým prvkom možno cez hranatozátvorkovú notáciu.
console.log(animals[0]); // "cow"
Polia majú dĺžku definovanú vo vlastnosti (property) zvanej length.
console.log(animals.length)); // 3
Cykly
Cyklus for
Najčastejšie používaný je cyklus for, a to v zápise “foreach”, kde
sa prechádzajú postupne prvky poľa.
for(let animal of animals) {
console.log(animal);
}
Klasický Java/C cyklus
K dispozícii je aj starý dobrý for cyklus s premennou
for(let i = 0; i < animals.length; i++) {
console.log(animals[i]);
}
Podmienky
Podmienka if má tradičnú syntax známu z C/C++/Javy a pod.
if (animals.length > 0) {
console.log("Old McDonald had a farm");
}
Pozor však na porovnávanie! Obvyklý operátor na porovnanie hodnôt je ==.
if (animals.length == 0) {
console.log("Old McDonald hasn't a farm");
}
JavaScript však dokáže automaticky prevádzať dátové typy jeden na druhý podľa potreby, z čoho je množstvo vtipov.
Je to vidieť v situácii:
let farmCapacity = "25"; //reťazec
if (farmCapacity == 25) {
console.log("This farm is seriously large!");
}
V tomto prípade JavaScript dokáže pochopiť, že kapacity farmy – napriek tomu, že je to reťazec – sa dá bez problémov porovnať s číslom.
V niektorých prípadoch je toto správanie výhodné, ale inokedy je zdrojom prekvapení.
Porovnaním cez tri “rovná sa” sa striktne porovnajú nielen hodnoty, ale aj dátové typy
if (farmCapacity === 25) {
console.log("This farm is seriously large!");
}
Funkcie
Funkcie sa zapisujú kľúčovým slovom function.
function sing(animal, sound) {
let song = `Old McDonald had a farm, I-a-i-a-oh.\n
And on his farm he had some ${animal}\n
I-a-i-a-oh\n
\n
And a ${sound} ${sound} here\n
And a ${sound} ${sound} there\n
Here ${sound}, ${sound} quack\n
Everywhere a ${sound} ${sound}`;
return song;
}
- Neuvádzajú sa dátové typy pre parametre, ani pre návratovú hodnotu.
- Funkcia pre spievanie má dva parametre:
animalasound. Návratovú hodnotu (výsledok funkcie) vraciame pomocoureturn.
Funkciu voláme klasicky:
console.log(sing("Cow", "moo moo"));
Objektové programovanie
V JavaScripte sú podporované triedy a objekty.
class Animal {
constructor(name, sound) {
this._name = name;
this._sound = sound;
}
makeSound() {
return this.sound;
}
get name() {
return this._name;
}
set name(name) {
this._name = name
}
toString() {
return this._name + " makes " + this._sound;
}
}
Trieda pre kravu má:
- konštruktor, uvádzaný kľúčovým slovom
constructor - metódy, uvádzané ako funkcie, ale bez kľúčového slova
function - metóda
toString()je prekrytá a vracia textovú reprezentáciu objektu, používanú napr. vo výpisoch cezconsole.log.
Novú kravu vytvoríme nasledovne:
let cow = new Animal("cow", "moo");
Použijeme ju:
console.log(cow.makeSound());
Modifikátory viditeľnosti v JavaScripte neexistujú. V príklade
sme použili _ ako predponu pre “pseudoprivátne premenné”.
Existujú aj gettery a settery. Ak máme novú kravu, môžeme jej meno získať cez
cow.name
Toto volanie zavolá príslušnú metódu get name().
Funkcionálne programovanie
S funkciami v JavaScripte sa dajú robiť skvelé veci! Funkcie sú integrálnou súčasťou jazyka.
Vytvorme si funkciu:
function singToConsole(animal) {
let song = `Old McDonald had a farm, I-a-i-a-oh.\n
And on his farm he had some ${animal.name}\n
I-a-i-a-oh\n
\n
And a ${animal.sound} ${animal.sound} here\n
And a ${animal.sound} ${animal.sound} there\n
Here ${animal.sound}, there ${animal.sound}\n
Everywhere a ${animal.sound} ${animal.sound}`;
console.log(song);
}
Ak máme pole, môžeme na ňom volať metódu forEach. V nej sa “pre každý”
prvok poľa zavolá príslušná funkcia.
let animals = [ new Animal("cow", "moo"), new Animal("pig", "oink") ];
animals.forEach(singToConsole);
Pre každé zviera sa zavolá funkcia singToConsole, ktorá má jeden parameter. Pre každý
prvom sa tak zaspieva jedna sloha.
Ako vidno, metóda forEach má jediný parameter typu funkcia.
Skrátený zápis funkcií
V niektorých prípadoch chceme použiť skrátený zápis pre funkcie používané v parametroch.
Predstavme si veľkú farmu
let animals = [
new Animal("cow", "moo"),
new Animal("cow", "moo, moo, moo"),
new Animal("pig", "oink"),
new Animal("pig", "oink, oinky oink"),
];
Ak chceme vypísať len zvuky kráv, môžeme si pripraviť funkciu:
function isCow(animal) {
if (animal.name == "cow") {
return true;
} else {
return false;
}
}
Tento zápis je ťažkopádny, pokojne môžeme vynechať if:
function isCow(animal) {
return animal.name == "cow";
}
Každé javascriptové pole má metódu filter, ktorá slúži ako filtračný papierik.
Do metódy vložíme funkciu s jedným parametrom. Každý prvok, ktorý funkcia
overí a vráti preňho true, prejde filtrom a pošle sa na ďalšie spracovanie.
Metóda filter potom vráti len pole prvkov, ktoré prešli filtráciou.
let onlyCows = animals.filter(isCow);
console.log(onlyCows);
V tomto prípade môžeme použiť aj skrátený zápis funkcie:
let onlyCows = animals.filter(animal => animal.name === "cow");
Všimnime si skrátený zápis: máme funkciu, ktorá berie jeden parameter, nazvaný
animal a vráti true pre každé zviera, ktoré sa volá cow.
V tomto skrátenom zápise netreba používať return, ten sa domyslí.
Výsledok si môžeme nechať vypísať:
console.log(onlyCows.toString());
Technická poznámka: na rozdiel od Javy/C# a pod, metóda log nie vždy
volá toString() na poliach.
Iný príklad, ktorý odfiltruje zvieratá a zároveň ich vypíše, je nasledovný:
animals.filter(animal => animal.name === "cow")
.forEach(animal => console.log(animal));
Iný príklad môže vypisovať zvieratá tak, aby MÚKALI VEĽKÝMI PÍSMENAMI.
Metóda map() na poli dokáže postupne brať jednotlivé prvky poľa, aplikovať
na každý prvok konkrétnu funkciu (“namapovať prvky na iné”) a výsledné
prvky pozbiera do nového poľa.
animals.map(animal => animal.name.toUpperCase()
.forEach(animal => console.log(animal));
JavaScript a Node.js
Node.js je platforma pre spúšťanie programov v JavaScripte mimo browsera. V súčasnosti je to veľmi populárna voľba na vývoj výkonných serverových aplikácii.
Node.js beží na každom operačnom systéme a v srdci mu búši výkonný javascriptový engine V8 od Googlu (rovnaký ako v prehliadači Chrome).
Predpoklady
- Nainštalujte
node.js. - Overte, že funguje správca balíčkov
npm(Node Package Manager):
Vytvorenie projektu
-
Vytvorme projekt založený na ECMAScript 6
- Vo WebStorme, resp. v IntelliJ IDEA v Preferences, Languages and Behaviour nastaviť ECMAScript 6.
-
V adresári projektu inicializujme projekt
npm init -
Vznikne popisovač projektu
package.json:{ "name": "kindergarten.js", "version": "1.0.0", }
Ukážka lodash
lodash je knižnica (modul) pre JavaScript s viacerými užitočnými funkciami pre prácu s kolekciami a pod.
Inštalácia lodash
npm install lodash --save
Z internetu sa stiahnu závislosti a do package.json pribudne sekcia
so závislosťami (dependencies):
"dependencies": {
"lodash": "^4.17.4"
}
Použitie v projekte
Vytvorme zdrojový súbor index.js, kde demonštrujeme použitie lodash.
Ak píšeme JavaScript pre prostredie Node.js, môžeme využiť závislosť
na module pomocou funkcie require():
const _ = require("lodash");
let temperatures = [10, 11, 6, 12, 18, 15, 5, 7]
let minimumTemperature = _.min(temperatures);
console.log(minimumTemperature)
Spustenie
Z príkazového riadku spusťme:
node index.js
Uvidíme výsledok v podobe najmenšieho čísla:
5
Ukážka fetch (REST klient)
Moderné webové prehliadače sprístupňujú klienta pre REST služby v podobe Fetch API. Tento klient sa dá použiť aj v Node.js, v module node-fetch.
Inštalácia
npm install node-fetch --save
Stiahnu sa závislosti pre knižnicu node-fetch a v package.json pribudne nový záznam.
Použitie
const fetch = require('node-fetch');
fetch('http://ics.upjs.sk/~novotnyr/javascript/animals')
.then(response => response.json())
.then(json => console.log(json))
.catch(error => console.log(error))
Funkcia fetch používa filozofiu Promises, ktoré skracujú zápis asynchrónnych volaní s podporou spracovania chýb. Podrobnosti možno nájsť v článku Asynchrónne veci v JavaScripte pomocou callbackov, promises a async/await.
Spusťme skript znovu:
node index.js
Uvidíme výsledný JSON:
[ { name: 'Venus', type: 'cow' },
{ name: 'Mr Pink', type: 'pig' } ]