JavaScript ES6 sintaksa
Uvod
Svako ko se bavi programiranjem bar izvesno vreme svestan je velike popularnosti koju programski jezik JavaScript uživa duži niz godina unazad, a takođe verujemo da među čitaocima (koje zanima ovakav članak), postoji i veći broj pojedinaca koji razmišljaju o karijeri koja je vezana za neko od ((veoma) brojnih) radnih okruženja koja se zasnivaju upravo na JavaScript-u (jednom od nekoliko najpopularnijih jezika današnjice).
JavaScript je svoj "životni put" započeo kao skriptni jezik za pristup DOM elementima u web browserima (naravno, i danas obavlja navedenu ulogu), ali, tokom vremena, prevazišao je početne okvire i postao osnova velikog broja zanimljivih radnih okruženja (Node.JS, Express, React, Vue, Angular ....), koja zajedno čine svojevrstan "ekosistem" za razvoj, pre svega web aplikacija, ali takođe i desktop programa, kao i raznovrsnih biblioteka i dodataka.
Kada je u pitanju "životni put programera", koji su prethodno razmotrili i ostale opcije (kojih takođe ima 'podosta'), izabrali JavaScript, savladali osnove jezika i (u bliskoj budućnosti) žele da se usmere na neku od prethodno navedenih tehnologija (ili na neko od okruženja koje nismo pomenuli), postavlja se pitanje: da li postoje tehnike koje (obavezno) treba savladati - što bolje - pre preduzimanja daljih, 'konkretnijih' koraka?
Smatramo da je odgovor (veoma nedvosmisleno) potvrdan * i smatramo da su tehnike koje treba savladati (posle osnova i pre upoznavanja sa nekim od pomenutih radnih okruženja) - upravo unapređenja koja su došla sa revizijom jezika ECMAScript 2015 (odnosno ECMAScript 6, ili još jednostavnije - ES6), za koja ćemo u daljem tekstu koristiti opšteprihvaćeni naziv - 'ES6 sintaksa'.
ES6 sintaksa - najvažniji elementi
Nećemo nabrajati sva unapređenja koja su došla sa revizijom ES6 (od kada popularnost JS-a zapravo i beleži najveći napredak) i nećemo previše ulaziti u detalje, ali, napravićemo osvrt na najznačajnije tehnike, koje - iz perspektive pojedinaca koji žele ozbiljnije da se bave Node.js aplikacijama ili da razvijaju sajtove u nekom od popularnih "framework-a" (kao što su React, Angular ili Vue) - slobodno možemo smatrati krajnje neophodnim.
Shodno prethodnim smernicama, ovaj članak biće svojevrstan informator za sve programere koji imaju nameru da se podrobnije upoznaju sa JavaScript-om (i pri tom već imaju iza sebe neophodno predznanje i dovoljno iskustva), a biće i svojevrsna rekapitulacija najvažnijih tehnika koje su deo ES6 sintakse, o kojima smo već pisali u drugim člancima.
Najvažnijim unapređenjima koje je donela verzija jezika ES6 smatramo arrow funkcije, šablonske niske i promise ("obećanja"), ali, počećemo od nečeg osnovnijeg ....
Novi način označavanja promenljivih - let i const
Iako se može reći da 'stari' način definisanja promenljivih (preko rezervisane reči var
), uglavnom nije zadavao prevelike probleme programerima, svakako je imao određenih nedostataka.
Pre svega:
- nije bilo moguće definisati konstante
- nije bilo moguće definisati promenljive koje važe samo unutar određenog bloka programskog koda (tj. samo 'unutar vitičastih zagrada')
Deklaracija podataka preko rezervisanih reči const
i let
otklanja navedene nedostatke i proširuje mogućnosti.
const
Kada se pri deklaraciji podatka koristi rezervisana reč const
, deklarisani podatak ima sledeće osobine:
- mora se inicijalizovati odmah pri deklaraciji
- nije moguće naknadno menjati vrednost *
- ako se deklaracija pojavi unutar bloka (tj. između vitičastih zagrada), dati blok predstavlja opseg definisanosti podatka
Poslednja stavka iz gornjeg nabrajanja, bitna je i zanimljiva: promenljive koje su definisane preko rezervisane reči var
, prepoznaju samo globalni opseg i opseg funkcije, dok rezervisane reči const
i let
omogućavaju deklaraciju promenljivih čiji je opseg (npr) telo while
ili for
petlje, jedan od blokova u if
grananju i sl.
Što se tiče dodele vrednosti, važe sledeća pravila: vrednost dodeljena (na primer) celobrojnoj promenljivoj - doslovno se ne može menjati naknadno, dok je situacija sa nizovima i objektima nešto komplikovanija (ali, i dalje sasvim razumljiva).
Kod složenih objekata koji su deklarisani preko rezervisane reči const
, "konstantna" je referenca na objekat, dok se (unutrašnje) stanje objekta može menjati, ali, bez naknadnog pozivanja naredbe dodele za (ceo) objekat.
Na sledećoj slici vidimo primere koji pokazuju šta se može (a šta ne može), raditi sa podacima koji su deklarisani preko rezervisane reči const
:
let
Promenljive deklarisane preko rezervisane reči let
imaju sledeće osobine:
- jednom deklarisana promenljiva, ne sme se ponovo deklarisati
- vrednost promenljive može se menjati naknadno
- inicijalizacija se ne mora obaviti pri deklaraciji
- ako se deklaracija pojavi unutar bloka (između vitičastih zagrada), dati blok koda predstavlja opseg definisanosti promenljive
Ponovo ćemo pogledati primer koji prikazuje navedene odlike:
Arrow funkcije
Arrow funkcijama (kao specifičnoj implementaciji lambda izraza u JavaScript-u), posvetili smo najveći deo članka o callback funkcijama i lambda izrazima i zato se ovoga puta nećemo previše zadržavati na detaljima, ali - podsetićemo se najvažnijih karakteristika.
Arrow funkcije (to jest, 'streličaste funkcije'), omogućavaju da se određena imenovana funkcija (koja je za određene potrebe možda previše "zvanična" i opširna), zapiše na jednostavniji način.
Ako za početak uzmemo funkciju koja vraća veću od dve unete vrednosti ....
.... i izostavimo rezervisanu reč function
i naziv funkcije, a potom izmeću parametara i tela funkcije dodamo 'lambda operator' =>
....
.... rezultat je arrow funkcija.
Budući da funkcija ima samo jednu naredbu (koja pri tom sadrži rezervisanu reč return
), funkcija se može dodatno pojednostaviti:
- izostavljanjem vitičastih zagrada
- izostavljanjem rezervisane reč
return
- time što će parametri i telo funkcije biti zapisani u istom redu
Sintaksa deluje 'kao stvoreno' za povratne pozive i pri tom - što i jeste glavna ideja koja stoji iza lambda zapisa - sve je veoma pregledno i elegantno.
Na primer, umesto imenovane funkcije:
.... ili standardne neimenovane funkcije:
.... može se koristiti arrow funkcija:
Naravno, postoji uslov: potrebno je da definicija funkcije bude zapisana na mestu na kome se funkcija poziva (a postoji i mogućnost da 'streličasta' funkcija bude povezana sa imenovanom konstantom).
Arrow funkcije (očigledno) predstavljaju veoma zanimljivo rešenje koje je široko rasprostranjeno u standardnim web aplikacijama koje koriste JavaScript, a pogotovo u Node.js projektima.
Šablonske niske ("pattern literals")
Šablonske niske su posebno formatirani tekstualni obrasci koji se zapisuju između znakova ``
("backtick"), i služe za umetanje vrednosti promenljivih i izraza u niske.
Na primer, pokretanjem sledećeg koda ....
.... u konzoli će biti ispisano:
Ili, malo 'konkretniji' primer (nalik primerima koji se svakodnevno koriste u radnim okruženjima kao što su Express, React, Vue i sl):
Promisi ("obećanja")
Za razliku od lambda notacije i arrow funkcija, što su koncepti koje relativno lako možemo predstaviti u nekoliko reči (čitaocima koji poznaju osnove jezika), sa 'promisima' to nije slučaj.
Ali, pokušaćemo ....
Ukratko (i pre svega), u pitanju je način da se lanac funkcija povratnog poziva (u kome izvršavanje određene funkcije zavisi od rezultata izvršavanja prethodne funkcije), umesto na sledeći način ....
.... zapiše mnogo preglednije:
Kada su u pitanju promisi, sa standardom ES7 (iz 2017), došla je i async/await
sintaksa (koju ćemo iz praktičnih razloga pomenuti, iako očigledno nije deo standarda ES6):
Moduli
U većim projektima, kada se javi potreba za podelom programskog koda na manje celine, kod se može podeliti u više datoteka (tj. "modula").
Preko direktive export
, u okviru svakog modula označavaju se funkcije koje će biti dostupne drugim modulima.
Ako za primer uzmemo da je skripta pomocne_funkcije.js
zapisana na sledeći način ....
.... funkcija Maksimum
može se koristiti samo u okviru modula u kome je definisana, ali se zato funkcije Obim
i Povrsina
mogu koristiti (i) u drugim modulima ....
Destrukturiranje
U JavaScript-u, termin "destrukturiranje" označava posebnu naredbu dodele koja dozvoljava preuzimanje određenog podskupa podataka koji su zapisani u okviru objekta ili niza.
Na primer, ako je objekat definisan na sledeći način:
... vrednosti pojedinačnih polja mogu se 'izvući' iz objekta (praktično - kopirati), i povezati sa spoljnim promenljivama:
Ili - u slučaju nizova ....
Klase
Sa klasama u JavaScript-u već smo se sretali (u više navrata), ali, pomenućemo ih ukratko i na ovom mestu, budući da su klase uvedene u JavaScript - upravo sa revizijom ES6.
Klasa predstavlja šablon za kreiranje (budućeg) objekta:
.... koji se može instancirati:
.... i koristiti dalje u kodu (kao objekat sa poljima i metodama) ....
Podrazumevane vrednosti parametara funkcija
Počevši od revizije ES6, JavaScript omogućava i korišćenje podrazumevanih vrednosti za parametre funkcija (prepoznaju se po naredbi dodele):
Funkcije sa proizvoljnim brojem parametara
Funkcija koja ja deklarisana na sledeći način:
.... može se pozvati na sledeći način:
.... pri čemu je jasno da se predati argumenti tretiraju kao niz - koji može sadržati proizvoljan broj elemenata.
Nove matematičke funkcije
Sa standardnom ES6, pojavile su se i nove matematičke funkcije:
Operator stepenovanja
Za kraj, jedna sitnica, koja - iako ne predstavlja 'preveliko unapređenje' - svakako dobro dođe.
Umesto da se stepenovanje zapisuje preko sledeće ("ne-baš-pregledne") sintakse ....
.... naredba koja računa (npr) četvrti stepen broja 2, može se zapisati (počevši od revizije ES6), na mnogo jednostavniji način ....
.... preko specijalizovanog operatora.
Kratak rezime ....
Članak o ES6 sintaksi predstavlja (kao što smo na početku naveli), kratku rekapitulaciju novih tehnika i "usputnu stanicu" (pre detaljnijeg udubljivanja), za pojedince koji imaju (dovoljno) prethodnog iskustva sa osnovama JavaScript-a - i odlučili su da savladaju Node.Js, Express, React, Vue, ili neku od drugih popularnih i široko rasprostranjenih tehnologija.
Međutim, ne moramo se obavezno usmeriti na Node.js ("i njegovu decu"), već možemo sve tehnike o kojima smo pisali, posmatrati i nezavisno, kao pojave koje su veoma zanimljive same po sebi, i pri tom predstavljaju deo jezika koji je često osporavan, ali je sa vremenom postajao sve bolji i bolji.
U svakom slučaju, posle upoznavanja sa ES6 sintaksom, otvaraju se brojni putevi.
U članku smo pomenuli samo neke (one najpopularnije), a vama ostavljamo da savladate tehnike koje smo predstavili, čime ćete sebi znatno olakšati rad u modernim razvojnim okruženjima koja kao programski jezik koriste JavaScript ....