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 poznasz operator rest, który został dodany do EcmaScript
6. Już przejdziemy do kodu i pokażę ci na czym sprawa polega, ale
najpierw w zapisie EcmaScript 5. Chciałbym sobie utworzyć funkcję o
nazwie calculate i chciałbym, żeby ona przyjmowała tak
naprawdę dowolną liczba argumentów. Natomiast jako parametry tutaj
wpiszę type i tyle. Dlatego, że chciałbym, żeby po tym tak można było tutaj
podać number. Na przykład 1, number 2 i tak dalej, ale
nie będę tutaj ich wypisywał, bo nie wiem ile ich będzie. Generalnie taka funkcja będzie
nam albo mnożyć albo sumować wszystkie podane po pierwszym
argumenty, więc zaraz sobie zobaczymy jak to wygląda. Na początek
jednak może ją wywołajmy i zrobimy to w console.log'u, tak żeby to było widać, w przeglądarce.
Napiszmy calculate i jako pierwszy parametry chciałem podawać string. No
i żeby tutaj było na przykład sum. Za chwilę jeszcze się tym zajmiemy, a jako
drugi i kolejny. Dowolna ich liczba, chciałbym podać na przykład 2, 22,
3, 7 i powiedzmy 13 i te
wszystkie chciałbym w tym przypadku dodać i teraz pytanie, jak możemy się odwołać
do tych parametrów, bo do sum możemy się odwołać po type, czyli zdefiniowałem type,
jest tutaj type, to będzie to co ktoś poda jako pierwszy argument. Natomiast
kolejne znajdą się razem z resztą w pierwszym pod zmienną arguments
i zobaczmy jak to wygląda. Pamiętaj, że na razie operujemy
jakby w ramach ES5. Jeszcze nic nie pokazałem związanego z EcmaScript 6.
No i zobacz, że arguments, jest to taka jakby pseudo tablica, bo jest to
obiekt, który wygląda jak tablica. Ma też indeksy i pod pierwszym indeksem,
czyli pod 0 znalazł się argument sum, a potem mamy kolejne,
czyli możemy się jakoś do nich dobrać, można tak powiedzieć i zrobimy
to w taki sposób, że pożyczymy sobie metodę slice z tablic i
wytniemy z arguments to co nas interesuje. Dlaczego mówię pożyczymy. Otóż,
arguments nie jest tablicą, więc nie posiada metody slice, która jest
na prototypie tablicy. Natomiast możemy to zrobić pożyczając ją od array.
Zrobię sobie let args i teraz właśnie w locie, na szybko utworze
tablice. Ona ma metody slice, ale zamiast ją wywoływać tak,
to nic by mi nie dało, to użyję call, żeby ją wywołać i do call podajemy
jako pierwszy tutaj argument to co ma być pod this w takiej
metodzie, więc podajemy sobie argument i dzięki temu na
arguments zostanie wywołana metoda slice i teraz muszę tutaj podać to, co
normalnie podałbym do slice jako pierwszy argument, czyli 1,
więc innymi słowy gdyby arguments to była prawdziwa tablica, napisałbym coś takiego
i to by mi zwróciło wycięte wszystkie indeksy od pierwszego,
czyli to jest zerowy to jest pierwszy. No i zobaczymy sobie teraz w console.log args, co
będziemy mieli. Zobaczymy i tym razem mamy już prawdziwą tablice
z wszystkimi argumentami oprócz pierwszego. Nie ważne ile podam. No i
jeżeli mamy już prawdziwą tablice, to aby dodać wszystkie te liczby
możemy to zrobić na kilka sposobów, generalnie jakaś pętla będzie potrzebna i zrobimy
sobie to za pomocą args i metody reduce. Ta
metoda przyjmuje funkcję jako swój tutaj parametr
i w niej będziemy mieć coś takiego jak prevVal, czyli poprzednią wartość i
aktualną wartość i teraz to co zwrócimy będzie jakby w kolejnej iteracji,
czyli zwrócimy sobie prevVal plus val i to oznacza,
że w kolejnej iteracji tej pętli będziemy mieli na przykład na początku
dodane 2 i 22 to jest 24, więc w kolejnej iteracji, bo ona będzie
robić takie jakby pętle. W kolejnej iteracji pod prevVal będzie to, co dodaliśmy,
czyli 24. Pod val będzie 3 i tak to się będzie dodawać do końca
i na końcu zwróci nam wynik, więc ja chcę go zwrócić
też z tej funkcji. Zrobimy to w taki oto sposób i zobaczymy czy nam się to
wszystko doda. Mamy wynik 47. Natomiast tutaj
jest świetne miejsce, żeby zastosować funkcję arrow, więc wytnę sobie
to, co jest w tym miejscu i będę chciał stworzyć taką oto funkcję. Natomiast
tutaj nie możemy mieć słowa function, tylko zdefiniujemy to w ten sposób. Mam nadzieję, że to
pamiętasz, więc definiuje dwa parametry, dlatego muszę je opleść nawiasami okrągłymi
i ona ma zwracać właśnie to wyrażenie, czyli wynik tego wyrażenia.
Zobaczmy i efekt znowu jest dokładnie taki sam. Natomiast
teraz chciałbym ci pokazać jak nie robić tego zapisu. Jak wykorzystać
operator rest, który jest dostępny w EcmaScript 6. Dlatego to
sobie wykomentuje i teraz musimy coś do tej funkcji dodać. Zrobimy
to na samej górze, gdzie mamy listę parametrów i type chcę oczywiście pozostawić,
ale oprócz tego mogę skorzystać z operatora rest. To są trzy kropki i
teraz nazwa zmiennej, nazwa parametru. Mogę go nazwać na przykład
args. Ta nazwa oczywiście jest dowolna, tak samo jak na przykład ten parametr i co
to oznacza? To oznacza, że przy wywołaniu tej funkcji to co ktoś poda pod pierwszym
argumentem ma być pod type, ale wszystko co zostanie podane później
ma zostać zebrane w formie tablicy pod parametrem args, czyli będziemy
mieli prawdziwą tablice tym razem, zróbmy sobie console.log args. Zobaczmy. Od
razu mamy prawdziwą tablicę, w której są wszystkie zebrane argumenty
właśnie z tego miejsca, czyli nie musiałem mówić, że od pierwszego wszystkie, bo
po prostu tutaj pierwszym jest type, gdybym tutaj podał jeszcze jakiś inny,
inny cokolwiek to dopiero od trzeciego
byłoby to zbierane do tablicy. Możemy zobaczyć, jak widzisz, dopiero tutaj mamy
22, a dwójka została pominięta, bo wpadła pod inny, więc
ważne jest tylko to, że ten operator rest. On może być
tutaj do dodany wyłącznie na końcu, czyli nie mogę tutaj dodać sobie jakieś parametru i nie
będzie tak, że pod nim będzie to co będzie ostatnią wartością. Gdybym zrobił to w ten sposób. Zobaczmy.
Będziemy mieli błąd i tutaj jest napisane, że rest musi być ostatnim parametrem,
który jest tutaj wpisany, więc to jest istotne. Natomiast zapamiętaj, że po prostu pod
nim będzie tablica zawsze i w tej tablicy będziemy mieli wszystko
to, co zostało podane. Gdybyśmy nic nie podali, zobaczmy jaki byłby tego efekt
i mamy w tym momencie pustą tablicę. Tak więc tak to wygląda
i zostawmy sobie to w tej formie, ale teraz jeszcze będę chciał zrobić
tak, żeby ta funkcja tutaj jako sum, które podaliśmy, mogła
przyjmować również multiply. W tym celu wkleję sobie taki
prosty kawałek kodu i zrobimy
sobie to w tym miejscu, tworzy obiekt calculations i w nim mam dwie metody some
oraz multiplay i zauważ, że do nich przypisuje funkcje strzałkowe, czyli taką funkcję
jak mam tutaj wyciąłem i wkleiłem w tym miejscu, a pod multiply, zrobiłem taką
funkcję i teraz jeżeli ktoś poda jako type sum, to chcę sobie wziąć to,
a jeżeli multiply, to to, więc to też będzie proste. W tym miejscu odwołamy
się do calculations i następnie do type, który ktoś podał. Teraz
sobie możemy skopiować to co mieliśmy w tym miejscu i podajemy mu multiply i ta
funkcja wtedy powinna nam wykonać tę metodę. Zobaczmy, no i
widzimy, że wynik sumowania to 47, a wynik mnożenia jest
tak jak tutaj widzisz. No i w zasadzie to wszystko jeżeli chodzi o ten operator
rest. Jeszcze do niego wrócimy w tym kursie, w troszkę innym kontekście,
natomiast przy funkcjach wygląda on dokładnie w taki sposób, że pozwala
zebrać wszystkie argumenty, które będą podane jakby w tym miejscu w formie
tablicy, a co zrobimy z tą tablicą, to już zależy później od nas.