Nowy Standard JavaScript
10 godz. 43 min · JavaScript · Full-stack i Programowanie
Piotr PalarzWeb DeveloperNa początku dowiesz się jakie nowości pojawiły się w języku, jeśli chodzi o tworzenie zmiennych i stałych. Poznasz dwa nowe słowa let i const, a także dokładnie omówimy ich różnice, względem znanego nam do tej pory słowa var. Następnie poruszymy temat obiektów. Zobaczysz jak nowy zapis pozwoli znaczenie ułatwić nam pracę i sprawić, by kod był bardziej czytelny. W kolejnym rozdziale porozmawiamy o zmianach w funkcjach. Poznasz tzw. arrow functions wraz z poradami, kiedy z nich korzystać, a także z konsekwencjami ich użycia. Zobaczysz również, jak korzystać z domyślnych parametrów. Następną nowością będą operatory rest i spread, które znacząco uproszczą pisanie kodu dla funkcji i tablic. Chwilę później rzucimy okiem na bardzo ciekawy temat, mianowicie na tzw. destructuring. To nowa funkcja języka, która pozwala w łatwy sposób wyciągnąć odpowiednie dane z tablic i obiektów, nawet jeżeli te posiadają kilkupoziomową, zagnieżdżoną strukturę. Zmian doczekały się również ciągi znaków. Poznasz nowy zapis, tzw. template string, a także możliwość wykorzystania funkcji tagujących.
ES6 wprowadza do języka JavaScript zapis klas. I choć na początku wydaje się, że to duży krok w stronę klasycznych obiektowych języków programowania, to jak się przekonasz, jest to w dużej mierze tzw. syntactic sugar, a więc zupełnie nowy, prostszy zapis, a prawie identyczne jak wcześniej działanie, oparte na dziedziczeniu prototypowym. W kursie poruszymy również temat Symboli oraz tego jak z nimi pracować, a chwilę później poznasz iteratory. To konstrukcje ułatwiające iterację, które znacząco upraszczają pracę z kolekcjami danych. Wraz z iteratorami poznasz również generatory, które ułatwiają z kolei tworzenie tych iteratorów. Istotną nowością w ES6 są również natywne Promise. To sposób na rozwiązanie problemu asynchroniczności, który znamy od bardzo dawna w postaci różnych bibliotek. Od teraz jednak Promisy znajdują się bezpośrednio w języku. Nowymi konstrukcjami, które pozwalają pracować z kolekcjami danych, są Map i Set. Dowiesz się jak z nich korzystać, a także do czego są przydatne. W jednym z rozdziałów rzucimy też okiem na tzw. Proxy API. To mechanizm języka, który pozwala na dość niskopoziomowy dostęp do różnych operacji. I choć być może nie jest to coś, z czego będziesz korzystał nad wyraz często, to warto wiedzieć, jakie są nowe możliwości tego API.
Jedną z najlepszych nowości, która zawitała do języka JavaScript wraz z ES6 są moduły. To możliwość dzielenia kodu na wiele plików, z których można pewne wartości wyeksportować, a następnie zaimportować je w innych modułach. Tutaj dowiesz się wszystkiego, co z modułami związane. Zobaczysz wiele sposobów na eksport i import, a także jak pracować z modułami w przeglądarkach internetowych. Kurs skupia się na omówieniu wszystkich najważniejszych nowości w ES6, dzieląc je na rozdziały. Jeden z nich natomiast, poświęcony został omówieniu mniejszych zmian, które znalazły się w specyfikacji. Poznasz w nim np. nowe metody tablic czy ulepszoną współpracę z Unicode.
Specyfikacja EcmaScript 2015 wprowadziła naprawdę bardzo wiele zmian, ale jej twórcy założyli, że od tego czasu każda kolejna wersja specyfikacji będzie pojawiać się co roku. Oznacza to przede wszystkim, że nie będziemy na raz bombardowani aż tak wieloma zmianami, jak w 2015 roku. W tym kursie nie zabrakło zatem omówienia nowości ze specyfikacji ES2016 oraz 2017, gdzie poznasz np. nowe metody dla stringów czy funkcje asynchroniczne.
Kiedy będziesz już uzbrojony w solidną wiedzę z zakresu nowości w ES6, dowiesz się jak w praktyce pracuje się dzisiaj z tym standardem. W jednym z rozdziałów omówimy nowoczesny workflow z użyciem npm i wykorzystamy popularne narzędzie webpack, do pracy z modułami, a także do transpilowania kodu ES6 do wersji ES5. Dzięki temu nowoczesny kod, który napiszemy, będzie mógł być uruchamiany również w starszych przeglądarkach, które nie wspierają najnowszego standardu. Dowiesz się na co zwrócić uwagę, by wszystko działało bez zarzutu.
Zwieńczeniem tego kursu będzie praktyczny projekt, w którym od podstaw wykonamy swoją własną bibliotekę do pracy z Obiektowym Modelem Dokumentu. Będzie ona w działaniu nieco podobna do znanej chyba wszystkim biblioteki jQuery. Na tym przykładzie postaramy się wykorzystać jak najwięcej wiedzy z zakresu ES6 zdobytej wcześniej. Stworzymy metody do pracy z drzewem dokumentu, a więc do wyszukiwania elementów, do tworzenia nowych, do przypisywania im klas, atrybutów czy styli CSS. Nie zabraknie również modułu odpowiedzialnego za współpracę z Ajax. Cały kod utworzymy oczywiście w sposób modułowy, aby bibliotekę można było łatwo rozwijać w przyszłości. Na koniec projekt ten przetranspilujemy do kodu ES5 z użyciem Babel i przetestujemy w starszej przeglądarce Internet Explorer 11, aby upewnić się, że nasza biblioteka działa poprawnie.
Kurs ten jest dla wszystkich osób, które znają już język JavaScript i czują się w pracy z nim swobodnie. Jeśli zatem chciałbyś pracować z nowoczesnym kodem JavaScript, to ten kurs jest zdecydowanie dla Ciebie. A może masz zamiar poznać framework Angular lub bibliotekę React? Tam również wykorzystywany jest najnowszy zapis ES6, więc wiedza ta będzie naprawdę pomocna. Z solidną wiedzą z zakresu EcmaScript 6, bez trudu pozostaniesz na bieżąco z każdą kolejną edycją tej specyfikacji.
W tej lekcji porozmawiamy o kolejnej długo wyczekiwanej możliwości,
która została dodana do ES6. Mianowicie o czymś co nazywa się domyślne
parametry. Nie jest to znowu rzecz, której nie dało się zasymulować
czy osiągnąć w EcmaScript 5. Po prostu zaraz zobaczysz, że musieliśmy
pisać trochę dużo niepotrzebnego kodu, a w innych językach programowania programiści
mają dostęp do czegoś co nazywa się domyślnymi parametrami. No i szkoda,
że my tak długo musieliśmy na to czekać w języku JavaScript. Niemniej jednak warto się cieszyć,
że coś takiego powstało, więc teraz pokażę ci jak to wygląda. Zobacz,
mamy tutaj funkcję multiply, do której przekazuje dwa
argumenty. Te argumenty to będzie jedna liczba
i chciałbym ją pomnożyć przez przez drugą liczbę i teraz nie
będę ci pokazywał jak ona działa, bo jest to oczywiste, ale chciałbym zrobić coś takiego, że
jeżeli multiplyBy, czyli drugi parametr nie jest tutaj podany,
to żeby miał on domyślną wartość i niesłychanie często można
zobaczyć taki zapis. Odwołujemy się do tej nazwy, bo tutaj wewnątrz
funkcji zawsze możemy to traktować jako lokalną zmienną, czyli mogę ją nadpisać
i robimy coś takiego multiplyBy lub
na przykład dwa. Chciałbym, żeby domyślna wartość to było dwa, czyli jeżeli teraz
ktoś wywoła naszą funkcję. Zaraz to zrobimy i poda tylko pierwszy argument, wpadnie on
pod ten parametr, a drugiego nie poda, to ma on wartość undefined. No i ten operator
działa także, jeżeli tutaj ma wartość fałszywą to przejdzie na prawą stronę i już nieważne
co tutaj jest, on to zwróci. Czyli po prostu nadpiszemy tę wartość i tutaj już
ten wynik się zmieni. Spróbujmy zatem. Najpierw sobie podamy poprawne
wartości, czyli multiply i powiedzmy 2 chciałbym
razy 3, mamy wynik 6, czyli wszystko zostało poprawnie
zwrócone, ale teraz jeżeli podam tylko 2. Zauważ, nie podałem drugiego parametru. Ma on
wartość undefined, czyli domyślnie to będzie dwójka. Zatem 2 razy 2
to powinno być 4. No i wydawałoby się, że okej, nie ma tutaj wiele,
jakby jakichś problemów, bo cały czas pamiętaj, mówimy o kodzie jeszcze w EcmaScript 5.
Co by się jednak stało gdybym ja chciał pomnożyć jakąś liczbę przez
0. Z jakiegokolwiek powodu to 0 byłoby tam podstawione. Może byłoby
to wynikiem jakiejś innej kalkulacji. No i spróbujemy na przykład 2 razy 0 wykonać
w języku JavaScript. Jest to poprawne działanie, które zwraca zero,
więc jeżeli teraz do naszej funkcji multiplyBy. Podam sobie zero jako
drugi parametr. Zauważ, że wynik jest od 4 a nie 0. Zero jest
wartością fałszywą. Jeżeli zatem wpada pod multiplyBy, to
tutaj ten operator, widząc zero, wartość fałszywa, przechodzi tutaj
i zwraca dwójkę i widzisz zatem, że ten sposób nie jest najlepszy i żeby
go poprawić to musielibyśmy to zapisać w nieco inny sposób. Dlatego
ja to teraz skopiuję i pokażę ci. Po prostu musielibyśmy sprawdzić czy ta wartość
jest równa undefined czy nie. Czy jeżeli jest równa undefined, to
wtedy takim operatorem chcę tutaj zwrócić dwa, a w przeciwnym wypadku multiplyBy. Teraz
ten zapis jest dłuższy, ale będzie działał w przypadku podania zero,
bo tutaj będzie zero nie jest równe undefined, czyli podstawimy tu
zero. Sprawdźmy zatem i teraz wynik jest to zero, ale nie jest
to po prostu eleganckie rozwiązanie. Pokażę ci zatem jak można w EcmaScript
6 przypisać sobie domyślną wartość parametru. Jest to bardzo proste przy parametrze
wstawiamy znak równości i po prostu poprzez przypisanie i wpiszemy
sobie domyślną wartość. Na przykład dwa. Od tej pory, jeżeli
nie podam drugiego parametru, domyślnie będzie to dwójka i spróbujemy. Dam tylko
dwójkę, wynik to jest cztery, ale jeżeli podam trójkę, wynik to jest 6,
bo wtedy domyślna wartość nie jest w ogóle brana pod uwagę. Pokażę
ci teraz jeszcze dwa ciekawe przykłady, bo okazuje się, że tutaj w zasadzie może być co chcesz.
Gdybyś miał jakąś funkcję, która ci pobiera jakąś wartość na przykład get value. Możesz
śmiało ją tutaj wywołać. To co ona zwróci, będzie przypisane do tego parametru. Czyli
tutaj dowolne wrażenie JavaScript'owe może być, oczywiście dwa plus dwa również. Natomiast okazuje
się, że w tym miejscu będzie można skorzystać, co ci zaraz pokażę z poprzednich
parametrów, ale na razie nie będę tego robił, bo pokażę ci po prostu inny przykład, który
powie ci czym jest tak zwane lazy evaluation, czyli leniwe, można
powiedzieć, ewaluowanie parametrów. Co to jest, pokażę
ci teraz na konkretnym przykładzie. W tym celu najpierw sobie przygotujemy jedną funkcję,
która jeszcze ci pokażę jak korzystać z poprzednich parametrów, a później jeszcze jedną, która z
tego wszystkiego skorzysta, więc ja może po prostu od razu ją wkleję
i nazwałem
sobie ją getCountryCode. Jako pierwszy parametr ona przyjmie tutaj country, a
jako drugi code, ale zauważ co ja mu przypisałem do domyślnej wartości. Otóż,
odwołałem się do country i teraz jeszcze na moment jeśli bym to usunął, to
to co jest ciekawe, to możesz odwoływać się w każdym kolejnym parametrze, ale
nie w poprzednich, do wartości, które były wcześniej, czyli mogę przypisać jako
domyślną wartość parametru code dokładnie to, co ktoś przekaże pod pierwszy tutaj
parametr country. Ale mogę też na nim się do czegoś odwołać. Czyli chciałbym
na nim najpierw to co ktoś przekaże zamienić to na wielkie litery, a potem wyciąć
trzy pierwsze znaki i z tego wszystkiego chciałbym zwrócić taki oto obiekt. Widzisz,
że tutaj korzystamy z tego co już się dowiedziałeś, czyli ze skróconego zapisu. Zamiast
pisać country równa się country i code równa się code, zwracam sobie taki oto obiekt
i teraz gdybyśmy sobie wywołali taką funkcję. Zobacz,
getCountryCode. Jeśli bym tutaj napisał
po prostu Polska i podał drugi parametr, czyli normalnie podam
drugi parametr code, na przykład pl, to
zostanie mi zwrócony obiekt country Polska code pl, ale jeżeli go nie podam,
bo chciałbym z tego Polska wyciąć sobie trzy pierwsze litery
i zamienić je na wielkie litery, czyli Polska będę miał pod country, a code
po prostu skorzysta z country i sobie to wytnie i to się znajdzie pod parametrem
już wewnątrz całej tej funkcji. Zobaczmy i teraz ta funkcja zwróci nam country
Polska code. Oczywiście tutaj nie będzie to dobrze działać dla
wszystkich krajów, ale jest to tylko taki przykład, abyś zobaczył, że można korzystać
z poprzednich parametrów w każdym kolejnym parametrze. No i nie
bez powodu dodałem do tej funkcji console.log, wykonuje funkcję getCountryCode, bo teraz
chciałbym ci pokazać na czym polega tak zwane lazy evaluation i wkleję teraz też
gotowy kod. Tworzymy sobie funkcję
getCountryInfo i chciałbym, żeby ona otrzymała ten obiekt, który tutaj
mieliśmy, czyli tam będzie country i code i następnie, żeby zwróciła taki string
państwo, to country info country i code to code i
zauważ, że pod country info wywołuje sobie naszą
funkcję, którą przed momentem wykonywałem. Ona zwróci jakiś obiekt, więc wywołajmy sobie country
info, ale
nie będę tutaj korzystał z domyślnego parametru, tylko go przekażę, więc
przekażmy sobie obiekt, który będzie miał w środku country, będzie to
na przykład na przykład Germany i code GER, w
ten sposób i widzisz państwo to Germany, a jego code to GER.
Nigdzie tutaj nie pojawiło nam się console.log z tej
funkcji. Tutaj mamy console.log, wykonuje funkcję getCountryCode. Co
to oznacza? Że jeżeli podamy parametr tak jak to przed momentem zrobiłam, jakiś argument
wstawimy, to nigdy nie jest prawa strona tego przypisania ewaluowana.
To się nazywa lazy evaluation, czyli nie ma sensu sprawdzać co by zwróciła ta funkcja
i gdzieś to trzymać na wypadek gdyby ktoś nie podał tego parametru,
tylko jeżeli go nie poda, to wtedy sobie wywołamy tą funkcje. Sprawdźmy czy tak
rzeczywiście się stanie. Jeżeli teraz byłem wykonał getCountryInfo i nie
podam nic, to wtedy skorzystamy z domyślnego parametru i okaże się, że
po pierwsze wykonał się console.log, bo JavaScript musiał wykonać tę funkcję. To
co ona zwróciła zostało przypisane do tego parametru i dopiero później wykonała się nasza
funkcja. Jak zatem widzisz domyślne parametry są naprawdę
przydatne. Po pierwsze możesz je przepisywać taki prosty sposób, ale pamiętaj, że tutaj
na przykład dowolne wyrażenia możesz przypisać. Zerknijmy sobie tutaj. Po
drugie możesz korzystać w każdym kolejnym parametrze z poprzedniego
i dodatkowo mamy tutaj coś takiego jak lazy evaluation, czyli
jeżeli nie jest potrzebny domyślny parametr, domyślna jego wartość, to wyrażenie,
które się znajduje tutaj po prawej stronie przypisania nigdy nie jest wykonywane.