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.
O ile w przypadku set mówiłem o tym, że najbardziej jest on podobny do tablicy, o tyle
w przypadku Map, czyli kolejnej konstrukcji, którą teraz poznasz, jest ona bardziej podobna
do obiektu, czyli w tablicy przechowywaliśmy jakieś pojedyncze wartości. Natomiast w
obiektach możemy przechowywać wartości, które są połączone za
pomocą klucza i wartości. Czyli key value pairs, mówiąc po
angielsku i map jest właśnie właśnie najbardziej podobne do takiego obiektu, czyli na przykład do
literału obiektu, z którego często korzystaliśmy. Pokażę ci teraz, jak utworzyć
nową mapę. Stwórzmy sobie zmienną, którą nazwiemy na przykład map
i będzie to new Map, czyli jest to kolejny konstruktor,
który możemy wywołać w ten sposób i teraz do mapy będziemy mogli pewne rzeczy dodawać. Tutaj
nie będziemy mieli metody add, ale metody set, get, metodę delete i
metodę clear, a także właściwość size. Oprócz
tego będziemy mieli jeszcze jedną metodę, czyli metodę has, która pozwoli nam sprawdzić czy
coś w takiej mapie się znajduje, więc na początku spróbujmy sobie coś dodać,
czy map set i napiszmy na przykład Jan Kowalski. Od
razu sobie zróbmy drugiego seta. Napiszmy Anna Nowak i wyświetlimy
sobie w przeglądarce co mamy pod map. Mamy właśnie taką mapę, gdzie kluczem
jest w tym przypadku Jan, a wartością Kowalski i drugim kluczem jest Anna i wartością jest
Nowak. Teraz jeżeli byśmy sobie chcieli coś wybrać
z takiej mapy, to możemy to zrobić za pomocą get. Mogę napisać
map get Anna, zobaczymy i mam
tutaj wartość Nowak, czyli podałem klucz, otrzymałem wartość. No i teraz mógłbyś
zapytać, co tutaj jest tak naprawdę takiego ciekawego. Pokażę ci teraz
inny przykład, nie będziemy wykorzystywać stringów dlatego, że w przypadku obiektów,
gdybyśmy sobie taki obiekt utworzyli, to pamiętasz, że też mogliśmy mieć tutaj jakiś string, na
przykład mógłbym mieć Jan Kowalski. Zamiast string'u mogłaby tutaj
być również wartość numeryczna lub w przypadku ES6 symbole,
ale nic innego. Natomiast w przypadku mapy, to co jest ciekawe, to dowolny
obiekt może być kluczem. No i to się wydaje na początku może niepotrzebne. Natomiast
zerknijmy sobie na taki przykład. Może wszystko to wykomentuję, wkleję tutaj
u góry dwa obiekty i powiedzmy, że chciałbym każdemu
z nich przypisać jakiś wiek, nie modyfikując obiektu. Coś takiego
nazywamy metadanymi, czyli mogę przypisać jakieś metadane do tych obiektów, ale
nie chcę ich modyfikować bezpośrednio, czyli nie chciałbym pisać person 1 age
równa się na przykład 32. Wtedy zmienię to bezpośrednio na tym obiekcie. Chciałbym
sobie utworzyć nową mapę, którą nazwę people i teraz
chciałbym napisać people set i właśnie jako klucz podajemy
obiekt, czyli podam sobie person 1 i wartość,
którą chcę tutaj przypisać, to powiedzmy niech to będzie 32. Może
zatem, żeby to miał więcej sensu, to zmieńmy sobie people na age. Może
niech to tak wygląda i teraz zróbmy age set. Dla person 2 ustawimy
sobie na przykład 22 i teraz jest o tyle ciekawe, że te obiekty w ogóle
nie zostały zmodyfikowane. Natomiast w mapie pod kluczem, który
reprezentuje taki obiekt mamy wartość 32 i teraz jeżeli chciałbym zrobić console.log
i napisałbym age get i przekazał
bym obiekt na przykład person 1 otrzymam wartość 32. Czyli mogę sobie
dodać jakieś dowolne dane do obiektu nie modyfikując zupełnie tego obiektu. Gdybyśmy
chcieli od razu ustawić sobie to co tutaj zrobiłem, to też możemy to zrobić, tworząc
nową mapę możemy podać jakiś interables, czyli na przykład tablice, w której będziemy
mieli kolejno następne takie tablice i pierwszy element
tej tablicy to będzie klucz, czyli na przykład person 1, a drugi
to wartość, którą chcemy dodać, na przykład 32 i teraz kolejna tablica. Byłby
to obiekt person 2 i wartość to byłoby na przykład 22,
więc mam nadzieję, że widzisz jak to wygląda. Klucz, wartość, klucz, wartość. Powinien
efekt być taki sam. Widzimy, że tak jest. No i teraz jeszcze na koniec pokażę
ci, że możemy sobie iterować po takiej mapie. Ona ma w sobie iterator
i ma również metodę for each, podobnie jak w przypadku setów. Natomiast zakładam,
że doskonale już znasz metodę for each, dlatego skorzystamy sobie z pętli for of.
Napiszmy sobie for let i tutaj możemy napisać na przykład,
no właśnie obiekt of age i
zobaczymy co zostanie tutaj zwrócone. Zróbmy sobie console.log obj, w
ten sposób i będziemy mieli, jak widzisz, tablice, w której pod pierwszym indeksem
jest obiekt, a pod drugim wartość, czyli tak by to wyglądało, dlatego jeżeli
chciałbym się odwołać konkretnie do tej wartości, to musiałbym napisać
na tej tablicy, która została zwrócona 1. Wtedy bym zobaczył
coś takiego. Natomiast, co ciekawe możemy tutaj również skorzystać z destructuring'u, który
przecież już znamy, ale na pętli for of ci go nie pokazywałem. Skoro
wiem, że w age czy w zasadzie tutaj pod
obiekt, zostanie nam zwrócona taka jakby tablica postawiona, widzieliśmy to,
zapiszmy raz jeszcze. Teraz jest to tablica, to
możemy sobie ją rozłożyć za pomocą właśnie destructuring'u, więc napiszmy
sobie, że pierwsza wartość to będzie obiekt, a druga to będzie wiek. Tylko,
że tutaj już mamy age, więc będziemy mieli błąd. Więc może napiszmy, że pierwsza jest
to person, a druga jest to person age i wyświetlimy
sobie person oraz console.log person age. Okej,
zobaczmy. No i będziemy mieli pod person cały obiekt, a pod age tylko
wartość wieku. Pokażę ci jeszcze teraz, że każdy map
zawiera w sobie kilka funkcji generujących, które zwracają iterator. Kiedy
skorzystaliśmy tutaj właśnie z let, na tym age, to
zostało na tym age wywołane entries, czyli gdybym tutaj napisało
entries, jest to generator, który zwróci iterator. Zobaczmy, że efekt będzie dokładnie
taki sam. Natomiast mamy jeszcze kilka innych generatorów. Jest to values. Możemy
tak napisać, czyli age jest to nasz map, a na map kiedy napiszemy
values, zostanie zwrócony iterator, w którym będziemy mieli tylko
wartości. Dlatego teraz musiałbym to zmienić i napisać na przykład value. Zobaczmy.
Czyli będziemy mieli tylko wartości 32, 22, pierwsze
zatem to było entries i to było domyślne, później values, które zwraca na same wartości
i mamy jeszcze trzeci taki iterator. Jest to keys i on będzie nam zwracał
tylko klucze, a klucze w przypadku mapy, jak widzisz, może być na przykład obiekt. To
co jest ważne, tutaj również mamy unikalność tak jak w przypadku setów, więc jeżeli mamy
już coś dodane i chciałbym napisać age set znowu person 1 na
przykład sto. To zostanie to owszem dodane, ale nie jako
nowa wartość, tylko ta wartość, która była, zostanie nadpisana, czyli
to nie będzie kolejny wpis. Sprawdźmy to sobie może w przypadku values. Mamy
wartość 100, więc to pokazuje, że nadpisałem wartość która już tam była, a nie dodałem
jakby trzeciego elementu do tej mapy. Jak zatem widzisz, mapy
są bardzo przydatne. Dlatego, że możemy do nich coś dodawać, mamy gwarantowaną
unikalność. Możemy również coś pobierać za pomocą get. Za pomocą size
możesz sprawdzić ile jest elementów w takiej mapie. Za pomocą clear możesz je wyczyścić. Za
pomocą has możesz sprawdzić czy dany element w takiej mapie się znajduje. Natomiast najfajniejsze
jest tutaj to, że możemy przekazywać jako klucz dowolny obiekt i możemy
pod tym kluczem przechowywać dowolne dane. Tutaj oczywiście mógł być na przykład jakiś obiekcik, więc
dzięki temu będziemy mogli przypisywać sobie metadane do
obiektów, nie modyfikując samych obiektów.