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 poznamy operator można powiedzieć odwrotny do operatora
rest, który nazywa się spread i od razu przejdźmy sobie do
kodu. Na początek oczywiście pokażę ci kilka przykładów z EcmaScript 5,
które możemy po prostu ułatwić sobie, korzystając z tych nowości
w ES6, więc będę chciał utworzyć sobie na początek taką tablice, która zawiera
liczby i chciałbym teraz zwrócić z tej tablicy liczbę która jest największa.
Moglibyśmy to zrobić metodą, która jest dostępna na obiekcie
Math. Cały czas jesteśmy w EcmaScript5, to nie jest nic nowego i metoda
nazywa się max i ona działa tak, że musimy i tutaj podać parametry czy
argumenty w ten sposób. Po prostu musiałbym te wszystkie rzeczy wyciąć i podać
je tutaj osobno. Ona wtedy zwróci mi największy z nich. Co jednak, gdy
chciałbym je podać jako tablice, czyli mam je w tablicy i chciałbym je podać. Chciałbym
tutaj podać po prostu numbers. Niestety, to nam nie zadziała. Z tego powodu, że
ta funkcja oczekuje, że podamy poszczególne argumenty,
a nie podane w formie tablicy. Da się to jednak obejść. Tak
naprawdę metodą apply, czyli zróbmy sobie tutaj może console.log, żebyśmy
to zobaczyli i odwołujemy się do math max i nie wywołuje tej funkcji standardowo,
tylko tak jak do tej pory już widziałeś na przykład za pomocą call można wywołać
jakąś metodę i możemy jej wtedy podać jako pierwszy
tutaj parametr this, więc w tym przypadku niech
to będzie math, bo odwołujemy się do math, to niech pod spodem this, to będzie math, a jako
drugi w metodzie call i kolejne można podać poszczególne parametry, ale
tutaj nic by mi to nie dało, bo musiałbym je wstawić w taki sposób, ale jeżeli metodę call
zamienimy na apply, to ona działa dokładnie tak samo, ale jako drugi parametr
pozwala podać tablice, więc podam numbers i metoda apply tak
jakby bierze tą tablicę i rozstrzeliwuje poszczególne parametry do poszczególnych
tutaj argumentów, więc dokładnie tak to będzie działać czyli
metody apply być może już znałeś. Ona w ten sposób pozwoli nam po prostu wywołać
dowolną funkcje, tak jak tutaj jest max. Natomiast pozwoli
nam przekazać tablice, która zostanie wstawiona pod poszczególne argumenty.
W ten sposób zobaczmy, wynik to 22 i mogliśmy sobie z tej
metody math max skorzystać. Teraz natomiast pokażę
ci operator spread, który pozwoli nam to zrobić w bardziej czytelny sposób. To
co mamy tutaj wykomentuje i zrobimy raz jeszcze console.log'a, w którym będzie math
max. Natomiast, żeby tutaj móc podać tablice, to
skorzystamy z takiego zapisu. Trzy kropki numbers i zauważ, że
jest to zapis identyczny jak w przypadku rest, ale używane w innym kontekście i
tutaj trzeba to sobie rozróżnić, czyli tamten był używany przy definicji
funkcji. Wtedy kiedy definiowaliśmy jakie parametry ona przyjmuje,
a ten jest używany już w kontekście wykonania funkcji. Zaraz jeszcze
zobaczysz inne przykłady, więc chociaż wygląda tak samo, to nie jest to operator rest, on
nic tutaj nie zbierze, ale weźmie już coś co ma. W tym przypadku tablice
numbers i rozstrzeli ją tutaj do metody max, czyli
ten operator spread działa tak jak byśmy wzięli tą tablicę i każdy z jej elementów
wstawili tutaj jako osobny, a tego oczekuje funkcja math max, więc
zobaczmy jaki będzie wynik takiego działania. Jak widzisz
jest to również 22, czyli poprawny wynik. Natomiast sam zapis jest
dużo bardziej czytelny. Po prostu mówi nam on, że tutaj jest jakaś tablica
i proszę ją rozstrzelić do poszczególnych argumentów tej funkcji. Ważne
jest tutaj, aby zapamiętać, że ten operator spread nie działa tylko na tablicach,
ale na przykład też na stringach i generalnie działa na wszystkim, co zawiera w sobie
iterator, a czym jest iterator, jeszcze się w tym kursie dowiesz. Tak więc zapamiętaj,
że musi być iterator wewnątrz takiej konstrukcji i wtedy będzie można ją rozstrzelić
za pomocą operatora spread. Pokażę ci teraz jeszcze kilka innych kreatywnych
sposobów na korzystanie z tego operatora spread, bo okazuje się, że nie
tylko przy wywoływanie funkcji można z niego skorzystać. Generalnie
co jeszcze jest ciekawe mógłbyś sobie tutaj podać jeszcze inne parametry,
gdybyś chciał, mógłbyś podać sobie na przykład sto, a po przecinku coś takiego
i ta funkcja dostałaby jakby sto i każdy inny parametr. Zobaczmy
czy ona wtedy zwróci sto jako największy argument. Okazuje się, że tak, ale
to ci jeszcze teraz pokażę na tablicach, więc chciałbym pod spodem utworzyć sobie tablicę,
którą nazwę numbers2 i chciałbym, żeby to była
tablica. Do nich wstawię sobie kilka liczb. Na przykład 2, 33
i 10 i teraz chciałbym dodać poszczególne liczby, które
znajdują się tutaj. Z EcmaScript 5 musiałbym skorzystać na tablicy z metody concat.
W ten sposób, żeby połączyć z inną tablica i podać tutaj numbers. Zobaczmy
console.log numbers 2. Jaki byłby tego efekt. Okazuje się,
że faktycznie te dwie tablice zostały połączone. Natomiast nie muszę tego robić ES6,
mogę sobie tutaj pobrać jakieś parametry czy w zasadzie jakieś elementy tablicy,
które mnie interesują, po czym po przecinku podam trzy kropki numbers
i znowu operator spread jakby wstawi wszystkie te poszczególne tutaj
wartości do tej tablicy i efekt będzie dokładnie taki
sam jak w przypadku konkatenacji tablic. Możesz to zobaczyć w tym miejscu. Co
ciekawe mógłbym sobie tutaj na początku dodać jeszcze na przykład 1 i 75
i w ten sposób utworzyłem sobie nową tablicę, która będzie zawierać wszystkie te liczby
oraz w środku te które były pod numbers i zauważ, że faktycznie tak
jest. Nie mamy tutaj żadnego błędu. Moglibyśmy nawet
połączyć sobie kilka takich wywołań, to znaczy tutaj w konsoli gdybym chciał utworzyć
tablice wiem, że numbers dwa jest tablicą, więc gdybym zrobił tak to utworze tablice
w tablicy. Zobaczmy jak by to wyglądało. Widać rzeczywiście, że tak jest, ale
jeżeli tutaj w środku zrobiłbym trzy kropki, to ja tym zapisem tworzę sobie nową
tablicę, a wewnątrz tej tablicy roztrzeliwuje wszystko co było w numbers, więc
generalnie będzie to działać dokładnie tak samo, czyli będzie to zwykła tablica, ale
mogę tutaj po przecinku powiedzmy podać sobie jeszcze te numbers, które
były u góry raz jeszcze. Mogę je sobie rozstrzelić i dodam
sobie jeszcze na przykład sto. Zauważ, że w ten sposób znowu utworze tablice, w której
będzie to co było w numbers 2, to co w numbers i dodatkowo jeszcze taki oto element.
Jak widzisz, dokładnie tak to wygląda. Okazuje się tak
jak wspomniałem, że można skorzystać z operatora spread na wszystkim, co zawiera w sobie iterator.
Również na stringu. Natomiast co by się stało gdybym tutaj na stringu chciał zrobić
taki operator i string byłby to Piotr. Okaże się, że mamy błąd, ale dlaczego?
Dlatego, że skorzystaliśmy z tego operatora w niewłaściwym kontekście, czyli
nie możemy sobie na przykład utworzyć zmiennej, jakiejś S i roztrzelić
tam w stringu albo czegokolwiek innego. Spróbujemy tutaj sobie rozstrzelić numbers 2 czy 3
taka operacja się powiedzie. Okazuje się, że nie no, bo co tutaj tak naprawdę
miałoby zostać pod s podstawione. Nie ma to sensu, ale gdybym utworzył tablicę i powiedział
do tej tablicy rozstrzel, wtedy jak widzisz nie ma z tym problemu. Podobnie
będzie ze stringiem. Natomiast samo rozstrzeliwanie string'u będzie polegało na tym, że
jego poszczególne elementy zostałyby wstawione na przykład do funkcji pod poszczególne
argumenty. W zasadzie mogę ci to pokazać w tym miejscu i gdybyśmy zrobili
tak. Trzy kropki przed string'iem i tutaj napisali Piotr,
to w tej tablicy okaże się, że mamy wszystkie te liczby, a potem poszczególne
litery z tego string'u. Natomiast zrobimy sobie to na trochę ciekawszym
przykładzie. Wyobraź sobie, że chcielibyśmy stworzyć funkcję, która zamienia string na tablice
znaków, więc stworzyłbym funkcje o nazwie string to array i
ona by przyjmowała jakiś string. Chciałbym,
żeby domyślnie była to wartość taka string'owa, żebyśmy nie mieli błędu kiedy będziemy
za chwilę korzystać z tego operatora i na początek pokażę ci jak
w ES5 można by było string zamienić na tablicę. Można byłoby się do niego odwołać
i metodą split, która rozdziela taki string rozdzielić
go na pustym ciągu znaków. Zróbmy sobie tutaj return i zróbmy pod spodem console.log Powiedzmy
string to array niech to będzie moje imię. Zobaczymy
jaki byłby efekt, jak widzisz mamy tablicę i w niej są rozstrzelone poszczególne znaki.
Natomiast możemy to zrobić teraz w ES6 jeszcze bardziej eleganckim zapisem.
Skoro chcę zamienić string na tablicę, to muszę zwrócić tablice, w tym
momencie jest pusta, ale rostrzelmy sobie string na poszczególne jej indeksy, więc
trzy kropki operator spread i następnie podany string. Dzięki
temu, że mamy tutaj wartość domyślną, jeżeli ktoś niczego nie poda, to również nie będzie błędów
i zauważ, że ta funkcja znowu zwraca nam poprawną tablice, czyli
ważne jest tutaj to, że to jest tworzenie nowej, pustej tablicy, ale
wewnątrz niej rozstrzeliwuję sobie taki Sting. No i teraz jeżeli ktoś, by nic nie
podał, to zobaczymy, zostanie zwrócona pusta tablica, nie będzie błędu,
a gdyby tego zabrakło, to mielibyśmy problem, bo na undefined nie
możemy znaleźć, jak widzisz, tutaj czegoś co nazywa się symbol iterator i jeszcze
o tym będziemy w tym kursie mówić. Z tej lekcji zapamiętaj tyle, że operator spread
jest odwrotny do rest, czyli rest pozwolił nam, można powiedzieć zbierać
wszystkie argumenty. Na przykład w przypadku funkcji do tablicy.
Natomiast spread pozwala nam rozstrzelić na poszczególne indeksy,
na poszczególne elementy coś, co może wyglądać jak tablica, ale tak naprawdę coś
to zawiera w sobie iterator, o którym będziemy mówić jeszcze później. Jak zatem widzisz
tutaj wiele jest sposobów na skorzystanie z operatora spread. No i myślę,
że od razu widzisz, że jest to operator bardzo przydatny i będziemy jeszcze z niego
w tym kursie wielokrotnie korzystać.