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 i w kilku kolejnych lekcjach poznasz nowe konstrukcje dostępne
w ES6, które pozwalają nam przechowywać dane jakby w jednym miejscu, czyli
mówiąc w jednym miejscu, mam na myśli takie porównanie, na przykład, do tablicy gdzie w tablicy
możemy pod jedną zmienną jakby przechowywać wiele różnych danych i podobne
będą właśnie ta konstrukcje, o których będziemy sobie teraz mówić. W tej lekcji poznasz
set i gdybyśmy mieli set porównać do czegoś z JavaScriptu co już znamy,
to najbliżej byłoby mu właśnie do tablicy. Dlatego przejdźmy sobie od
razu do kodu i utworzymy sobie nowy set i pokażę ci jak możemy pracować z jego
metodami. Pod zmienną s utworze sobie nowy set. Zauważ,
że mamy teraz taki nowy globalny konstruktor, który nazywa się Set, z wielkiej
litery i new Set zwróci nam nowy obiekt, w którym możemy przechowywać różnego
rodzaju dane i teraz ten obiekt, co jest ciekawe ma tylko cztery metody. Tak
naprawdę jeszcze piątą, ale o tym za moment. Natomiast cztery metody dla nas jakby
nowe. Jest to add. Następnie delete has oraz clear. Dodatkowo
taki set ma właściwość size, która działa tak jak właściwość length na
tablicach, więc dodajmy sobie teraz jakieś nowe dane. Napiszemy s
i metodą add możemy sobie coś tutaj dodać. Przekazujemy to tutaj
jako jedyny parametr, więc dodam sobie taki oto string i to dodajmy sobie jeszcze
drugi, na przykład Anna, oczywiście to nie muszą być stringi, tutaj może
być co tylko chcesz. Każda konstrukcja JavaScript'owa, którą można gdzieś przekazać
może być dodana do set'u, więc może to być dowolny obiekt. Zapiszmy
i zobaczmy sobie tutaj co pod s się znajduje. Widzimy, że jest to set
i gdybym napisał s size, czyli jest to właśnie ta właściwość
podobna do length, to zwróci nam to 2. To co jest ciekawe
w przypadku set'u, czego nie ma na tablicach, to jest fakt, że dane muszą być unikalne,
czyli gdybym chciał drugi raz dodać sobie Piotr, to
zobaczmy czy będzie jakiś błąd. Okazuje się, że nie ale s size zwróci nam
teraz dwa, z tego powodu, że Piotr nie został drugi raz dodany
i w tym secie nadal mamy tylko Piotr i Anna, czyli dane tutaj zawsze muszą być
unikalne. Gdybyśmy przekazywali jakieś obiekty, to zachodziło by tutaj takie samo
porównanie, jak w przypadku Object kropka is, czyli metody, którą ci pokazywałem
już tym kursie, w przypadku nowych metod dla obiektów. Czyli jeżeli mamy
dwa obiekty, one zawsze są różne chyba, że to jest ten sam obiekt. Po prostu, jeżeli podamy
referencje do tego samego obiektu, no to wtedy to będzie taki
sam obiekt i on drugi raz nie zostanie dodany, natomiast takie wartości jak wartości prymitywne
typu string, wiadomo, że i Piotr i Piotr tutaj to nie jest jakby ten
sam string, ale jest taki sam string, więc drugi raz nam się tego nie uda dodać. Z
takiego setu możemy sobie coś usunąć metodą delete, gdybym
napisał delete Piotr. Zobaczmy, teraz s będzie
miał tutaj tylko Anna. No i mamy jeszcze dwie ciekawe metody. Jedna jest to has, ona
nam pozwoli sprawdzić czy coś w takim secie jest. Czyli mógłbym zrobić console.log s has Anna
i to zawsze zwraca true lub false. Widzimy true. W przypadku Piotra byłoby
to już false i mamy jeszcze taką metodę jak clear. Wyczyści
ona wszystko co w takim secie się znajduje, więc teraz jeżeli bym zrobił console.log, w zasadzie
możemy zrobić identyczne jak tutaj, to okaże się, że Anna już
się tam nie znajduje. Czyli mamy takie właśnie metody jak tutaj widzisz, add, delete,
has oraz clear i właściwość size. Spróbujmy
sobie teraz zatem do takiego setu przekazać jakieś wartości nieprymitywne. Wkleję
sobie tutaj dwa obiekty i mamy
dwa takie obiekty, one są różne. Już na pierwszy rzut oka, ale nawet gdyby miały identyczne
właściwości, ich wartości, to zawsze będą to dwa różne obiekty w języku JavaScript
i teraz gdybyśmy sobie może to wykomentowali i spróbowali do tego setu
je dodać, to pokażę ci jeszcze może właśnie jak to zrobić inaczej, bo mógłbyś napisać s
kropka add person 1 i tak dalej. Natomiast można tutaj tworząc
nowy set od razu przekazać jakiś iterable, czyli coś co zawiera w sobie iterator. Do
tej pory powinieneś już wiedzieć, że może to być tablica string lub na przykład własny
typ, do którego potrafiliśmy już dodać sobie iterator, na przykład z pomocą generatora,
czyli cokolwiek co zawiera w sobie iterator może być tutaj podane. Dlatego
może to być tablica. Tworzę zatem tablice, do której wstawie person 1 i person 2
i od razu te dwa obiekty zostaną dodane do setu, więc
gdybym tutaj gdzieś na dole sobie zrobił console.log s has person
1, zobaczmy, to będę miał wartość true. No i zapewniam cię, że drugi
raz takiego person 1 nie mógłbym tam dodać. Natomiast gdybym chciał ten obiekt usunąć,
oczywiście muszę mieć do niego referencje, czyli na przykład tutaj pod tą zmienną
to mam i mógłbym napisać s delete i właśnie podać person
1. Myślę, że na tym etapie już widzisz różnicę między tablicami. Aby
sprawdzić czy jakaś wartość jest w tablicy, musielibyśmy zrobić na przykład array kropka
indexOf, podać wartość i sprawdzić czy nie
jest ona równa minus 1, czyli to co zostało zwrócone, czyli metodą indexOf
moglibyśmy to sprawdzić, natomiast gdybyśmy chcieli usunąć jakąś wartość z takiego
set'u, tutaj mam metodę delete w przypadku tablicy. Nie wiem czy kiedykolwiek to
robiłeś, ale metodą splice, nie slice tylko splice, możemy usuwać. No
i zawsze musimy najpierw poznać indeks takiego elementu, a później metodą splice go usunąć. Także
jest zawsze troszeczkę z tym zabawy, a tutaj jest to dużo prostsze. No
i to co jest ważne, każdy set też jest iterable, czyli ma w sobie iterator, a
więc możemy używać na nim operatora spread lub na przykład pętli for of. Co
jest jeszcze ważne to set'y zawierają też metodę for each,
tak jak tablice. Natomiast nie mają innych metod tablic takich jak na przykład filter, czyli
mógłbym napisać s for each i tutaj na przykład funkcją arrow
mógłbym sobie sprawdzić value i wyświetlić w
konsoli, console.log value. Zobaczmy. No
i widzimy, że są to właśnie takie oto obiekty. Natomiast również pętla for of by
tutaj dobrze zadziałała, czyli na przykład let value of s console.log s
czy console.log value w zasadzie, w tym momencie. Zobaczmy. Podobnie. Efekt
jest taki sam. Na koniec pokażę ci jeszcze jeden ciekawy przykład.
Otóż skoro wiemy, że set może mieć tylko unikalne dane, to możemy
sobie stworzyć fajną funkcję, która pozwoli nam z tablicy zwrócić nową tablicę, która
ma tylko unikalne dane. Utwórzmy sobie tablice arr,
która ma jakieś powtórzone dane. Na przykład jedynka będzie miała kilka razy i chcielibyśmy
po prostu usunąć. No i teraz moglibyśmy sobie stworzyć funkcje, na przykład removeDuplicates,
której byśmy przekazywali jakąś
tablice. Napiszmy sobie tutaj arr, a tutaj może zmieńmy to na numbers
i teraz wystarczy
zrobić coś takiego, że chcemy zwrócić nową tablicę, ale wewnątrz tej
nowej tablicy utworze sobie nowy set. Pokazałem ci wyżej, że możemy
tworzyć set przekazując mu tablice lub coś co ma w sobie iterator, więc tą
tablicę przekazaną tutaj przekażę do set'u. To nam zwróci nowy set, który
będzie zawierał wyłącznie unikalne dane, więc te jedynki nie mogą być tutaj powtórzone
i następnie cały ten set, skoro jest iteratorem, rozbijemy operatorem
spread do tej nowoutworzonej tablicy, którą zwracamy z tej funkcji. Zobacz,
jeżeli teraz sobie zrobimy removeDuplicates i przekażemy numbers to
powinniśmy zobaczyć nową tablicę, która ma tylko unikalne wartości, więc
to pokazuje, że możemy wykorzystać te możliwości set'u
chociażby w taki sposób, ale setami można pracować w każdej innej
sytuacji gdzie chcemy zastąpić tablice i korzystać z takich metod jak na przykład metoda
delete, bo na tablicach, tak jak wspominałem jest to troszeczkę bardziej skomplikowane, a
w przypadku set jest uproszczone. No i właśnie po to powstała taka nowa konstrukcja.