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.
Razem z nowym zapisem string'ów, czyli template strings, otrzymaliśmy
również coś, co nazywa się funkcją tagującą lub z angielskiego tag
function i pokażę ci teraz na czym ona polega. Jest to coś co być może nie będzie
aż tak często dla ciebie przydatne, ale nie mógłbym tego pominąć w tym
kursie, jeżeli mówimy o template string'ach. Więc na początek zrobiłem sobie coś
takiego i tutaj nie powinno być już dla ciebie nic nowego. Czyli mamy obiekt, z którego wyciągam
sobie pewne właściwości i zapisuje je pod nowymi zmiennymi.
Czyli zmienna to będzie pName i pPrice i będę chciał utworzyć
sobie taki template string, w którym po prostu to wstawię i za pomocą console.log wyświetle,
czyli efekt będzie taki. Dodałeś do koszyka produkt płyta DVD, cena 1.
Natomiast teraz chciałbym, aby to jeden zostało sformatowany na
1.00 PLN lub na przykład zł, czyli
złotych. Pokażę ci za moment jak możemy to zrobić, na przykładzie funkcji tagującej.
Jak stworzyć funkcję tagującą, jak ją wywołać. Przejdźmy sobie na samą górę i nazwę
funkcji formatPrice. Tworzymy zwyczajną funkcję
tak jak robiliśmy to zawsze, natomiast wywołujemy ją tutaj nie
przekazując jej cały ten string, ale pisząc coś takiego formatPrice i znowu jest
to nowy zapis w JavaScripcie, wcześniej coś takiego byłoby błędem, nie moglibyśmy tak napisać. Natomiast, jeżeli
chcesz taki string stagować taką funkcją, masz jakąś funkcję
i wstawiasz ją tutaj bezpośrednio przed samym takim stringiem. Jeżeli
byśmy tak zrobili też nie będzie żadnego błędu, można tak zrobić, natomiast
lepiej to wygląda taki sposób. No i teraz przejdziemy
sobie tutaj i musimy uzupełnić parametry,
które się będą w tej funkcji pojawiać, bo bardzo ciekawe jest co tutaj będzie. Natomiast powiem
ci od razu, że to co on zwróci, jeżeli by ona zwracała Hej,
to cały ten string to będzie po prostu Hej. Zauważ, jest to Hej.
Sprawdźmy jeszcze tylko, co by było gdybyśmy tutaj postawili spację i będzie
to działać tak samo, więc ta funkcja coś otrzyma i coś zwraca i to co ona zwróci
to całość zostanie dopiero podstawiona tutaj do zmiennej info. Natomiast
co w niej otrzymamy? Pierwsza rzecz to będzie string i w
zasadzie będzie to tablica, więc mogę nazwać ją strings. No i zobaczymy co tutaj się
znajdzie, console.log strings. Wyświetlmy
i okaże się, że otrzymamy tablice ze wszystkimi string'ami, które
się znajdowały w całym tym ciągu i zauważ, że mamy coś takiego. Dodałeś
do koszyka produkt dwukropek spacja, czyli jest to ten pierwszy cały string
aż do momentu gdzie pojawiła się jakaś wartość, w tak zwanym placeholder'ze. Następnym
stringiem było coś takiego w cenie, zobaczmy. Faktycznie on się tutaj pojawił
i ostatnim była kropka, czyli te string'i znajdą się w tablicy
strings. Natomiast teraz, pojawi się tutaj jeszcze
jeden parametr, ale w nieco inny sposób. Czyli nie ma tak, że te
wartości, które są w tym miejscu pojawią się na przykład tablicy values. Okazuje się, że
nie. Zobaczmy, co by tam było. Pod value mielibyśmy
płyta DVD, czyli tak naprawdę tylko to, co zostało tutaj jakby
podstawione, czyli ta wartość. To co zostało tutaj zinterpolowane. Jak
zatem dobrać się do wartości price, która jest w tym miejscu. Musiałbym ją tutaj utworzyć jako
kolejny parametr i zrobić kolejny console.log price. Jak
widzisz, teraz jest wszystko okej, natomiast przecież nigdy nie wiemy z góry, ile tutaj będzie takich placeholder'ów,
więc być może już się domyślasz, że tutaj świetnym rozwiązaniem będzie skorzystanie z
operatora rest, czyli w pierwszym będziemy zawsze mieli tablice ze string'ami,
a w drugim i w kolejnym będzie mieli poszczególne wartości, które tutaj z
tych wyrażeń zostały wyliczone, więc chcielibyśmy sobie je zwrócić
w formie tablicy values. Zobaczmy jak to teraz będzie wyglądać. No i
będziemy mieli string'i w jednej tablicy, a wartości podstawione w drugiej. Ważne
jest to, że ta druga tablica zawsze będzie o jeden element krótsza niż ta u góry.
Zawsze tak będzie, nawet gdybym tutaj na końcu nie dał tej kropki, zobaczmy.
Tak powinno być. Jak widzisz na końcu otrzymuje w tym momencie pusty ciąg
i podobnie mogłoby być na początku gdybym coś interpolował tutaj od samego początku.
Zerknijmy, też bym otrzymał pusty ciąg, czyli taka jest zasada, że tutaj zawsze
jest jeden element więcej. Okej, zostawmy sobie to w takiej formie. No
i teraz skoro te wartości tutaj mamy, to coś z nimi możemy zrobić. Gdybyśmy
chcieli odwzorować działanie takiego sting'u, czyli wszystko tutaj połączyć tak jakby nie było tej
funkcji, to moglibyśmy to zrobić w następujący sposób. Musimy sobie wykonać
jakąś pętlę i wykonamy ją na tej tablicy strings forEach, na
przykład. To jest jeden sposób na zrobienie pętli. Zróbmy sobie tutaj taką
oto funkcję, która otrzyma jeden pojedynczy string, czyli na przykład to dodałeś do koszyka,
a pod drugim parametrem indks takiej iteracji, czyli na przykład 0, 1, 2, 3. Wcześniej
natomiast utworzylibyśmy sobie za pomocą na przykład let zmienną output, która
byłaby takim pustym ciągiem znaków. No i tutaj byśmy do output chcieli sobie
dodać, czyli plus równa się string i dodatkowo
do tego dodalibyśmy sobie jeszcze wartość, która znajduje się tutaj w values, czyli
mieliśmy na przykład w tym miejscu płyta DVD, więc odwołałbym się do values. Wiemy, że za pomocą
operatora rest, jest to tablica i podałbym po prostu ten indeks. Zobaczmy
czy ma to sens i na końcu byśmy zwrócili oczywiście output. Okazuje
się, że tak. Z tym, że na samym końcu pojawi nam się jeszcze undefined, bo wykonuje iterację
na strings, a strings, powiedziałem ci, że ma zawsze o jeden element więcej niż
jest w tablicy values. Dlatego tutaj mógłbym zrobić sobie taki warunek if
values pod index nie jest równa undefined, to
wtedy chcę to po prostu dodać, czyli output plus,
równa się values, index. Mam nadzieję, że też ma to dla ciebie sens i
teraz odwzorowaliśmy sobie tak naprawdę domyślne działanie, gdybyśmy
nie skorzystali zupełnie z funkcji formatPrice. Zobacz. Dokładnie
tak samo to wygląda. Natomiast po co z tej funkcji tagującej skorzystaliśmy? Bo chcę ci
teraz pokazać, że możemy tą cenę, która jest tutaj zamienić sobie na
troszkę inne formatowanie za pomocą takiej funkcji. Gdybyśmy raz
jeszcze zerknę i sobie pod console.log do values, to zobaczyłbyś, że wartość która tutaj
będzie pod tym pPrice, czyli po drugim indeksem. Jest to wartość numeryczna, czyli
po prostu number. Dlatego w tym miejscu, gdzie jesteśmy tutaj. Mógłbym sobie zrobić
jeszcze jedno sprawdzenie. Jeżeli typeof
values index, a skoro tyle razy się do tego
odwołujemy to może utworzymy sobie taką zmienną. Napiszmy let value
równa się values index, czyli będę
tutaj miał wartość albo płyta DVD albo 1, w tym przypadku, więc
tutaj się odwołajmy po prostu do value. Podobnie
zrobimy w tym miejscu, value i tutaj. Jeżeli typeof
value to się równa number, to
coś zrobimy, a w przeciwnym wypadku dodamy tak jak przed momentem. Więc
jeżeli to jest number to chciałbym go w jakiś fajny sposób sformatować, czyli tą cenę jakoś
sformatować, więc value napiszemy toFixed 2,
to zawsze wykonane na jakiejś liczbie zwróci
nam string, który będzie w ten sposób sformatowany i chciałbym do tego dodać sobie jeszcze PLN, w
ten sposób i to dodamy do output. Zobaczmy
jak to teraz będzie wyglądać i zobacz, dodałeś do koszyka produkt płyta DVD w cenie
1 zł, więc tak moglibyśmy to zrobić. Oczywiście gdyby w tym stringu
pojawiły się jeszcze jakieś inne wartości numeryczne, to one również tutaj ten warunek by
spełniły i też zostały by tak sformatowane, więc tutaj, to już zależy od
konkretnego przypadku. Natomiast chciałbym ci pokazać wykorzystanie funkcji tag'ującej. Ona
otrzymuje wszystkie string'i, które są tutaj oraz wszystkie wartości, które
możemy zebrać operatorem rest do tablicy values. No i później musimy zwrócić
jakiś nowy string, który zostanie podstawiony pod taką całość. Już
w internecie gdyby sobie wyszukał, deweloperzy stworzyli bardzo wiele różnych funkcji tag'ujących,
które na przykład zajmują się można powiedzieć internacjonalizacją,
czyli tłumaczeniem jakiś różnych wartości na potrzeby wielojęzykowych
stron i tak dalej, więc zastosowanie może być naprawdę szerokie. Jeżeli
tobie się to nie przyda, to przynajmniej będziesz wiedział, że coś takiego istnieje, bo tak
jak wspominałem na początku, nie chciałbym tak istotnej rzeczy w tym przypadku pomijać. Jak
zatem widzisz, dokładnie w taki sposób można pracować z tak zwanymi template strings. Natomiast w
kolejnej lekcji pokażę ci jeszcze jakie nowe metody w ogóle do stringów
zostały dodane w EcmaScript 6.