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 dowiesz się czym są iteratory w EcmaScript 6, ale także
jak taki iterator stworzyć z użyciem zapisu ES5. Będę chciał ci to pokazać
po to, abyś zrozumiał w jaki sposób działają iteratory. Dlatego, że w kolejnych lekcjach
pokażę ci z kolei jak z nich korzystać i jakie są ich ogromne zalety.
Tak więc moim zdaniem bardzo ważne jest, aby rozumieć jak taki działa i potrafić
go napisać również, można powiedzieć ręcznie. Generalnie
iteratory są to takie konstrukcje, które będą nam ułatwiać iterację, czyli
będziemy je mogli wykorzystywać na przykład w pętlach i one można powiedzieć,
że w wielu sytuacjach eliminują zbyt zagnieżdżone pętle, które są po prostu zbyt
skomplikowane do, chociażby, przeczytania w kodzie czy później
do jakiegoś modyfikowania i tak dalej, więc przejdźmy sobie od razu do kodu i ja po
prostu pokażę ci jak stworzyć taki iterator. No i jak będziemy przez ten proces
przechodzić, to pewne koncepcję wytłumaczę. Generalnie
iterator jest taki obiekt, który ma metodę next i kiedy ją wywołujemy,
to ma być zwrócona kolejna wartość, czyli chciałbym sobie utworzyć iterator. Zaraz
będziemy musieli go otworzyć, ale najpierw chciałbym utworzyć tak jak gdyby jego instancję. Chciałbym móc napisać
iterator, ale oczywiście przejdźmy sobie do odpowiedniego pliku. Będzie to
30 i tutaj start scripts. Napiszemy sobie let
iterator i chciałbym wywołać jakąś funkcję it, która mi go zwróci. Zaraz
ją sobie napiszemy, możemy tutaj od razu u góry to zrobić. Mogę to
zrobić za pomocą słowa function lub jako stałą na przykład, więc można
również tak to zrobić, it to się równa function, czyli to co one
zwróci będziemy mieli później tutaj. Natomiast samo użycie jak wspomniałem wygląda tak,
że na iteratorze powinniśmy mieć metodę next i ją możemy
wielokrotnie wywoływać i ona nam powinna za każdym razem zwracać taki oto obiekt,
który będzie miał value i tutaj będzie dowolna wartość, na przykład 1. To może
być obiekt, jakakolwiek wartość, a drugi klucz, to będzie done
i tutaj będzie true lub false, czyli jeżeli będzie false to znaczy, że powinniśmy
kolejny raz napisać iterator kropka next i dostaniemy kolejną wartość w takim
obiekcie, a jeżeli tutaj mi się pojawiło true, wtedy tutaj już nie będzie
wartości, tylko będzie wartość undefined albo w ogóle ten klucz nie będzie podany czyli
też będzie miał wartość undefined i wtedy wiemy, że musimy zakończyć iterację, więc
musimy sobie teraz napisać taki iterator tutaj po to, żeby metoda next za
każdym razem zwracała na taki oto obiekt z value oraz z done. No
i jak byśmy to mogli zrobić. Tutaj w ogóle to iterator next będę chciał
zrobić w console.log'u i za moment będziemy widzieli w konsoli co tam zostaje zwrócone. Na
razie, oczywiście, byłby błąd bo taka metoda next nie istnieje na tym co mamy
tutaj, więc skoro po kropce się odwołujemy do iterator next, to
znaczy, że tutaj powinien być jakiś obiekt, a więc zwróćmy sobie z tej funkcji obiekt
i fajnie gdyby on miał metodę next. Możemy ją zapisać tak. Możemy
również w tym skróconym syntax'ie, no ale powiedzmy, że jesteśmy w EcmaScript 5, więc
napiszemy normalną funkcję i ona coś tam będziesz zwracać, czyli mam nadzieję,
że na razie to widzisz. Za po pierwszym wywołaniu it, czyli tej funkcji, zostanie
zwrócony obiekt, właśnie tutaj, który będzie w sobie zawierał metodę
next. Ta metoda jest tutaj i ona za pomocą domknięcia zrobimy tak,
żeby miała dostęp do tej zmiennej tutaj, którą zaraz utworze, bo skoro
funkcja jest zdefiniowana w tym miejscu, to ma dostęp do zmiennych, które są w
tym zakresie widoczne i właśnie dlatego te dane będą ukryte, ale
za pomocą metody next będziemy sobie mogli je pobierać i chciałbym tutaj mieć
tablice numbers, w której będziemy mieli 1, 2, 3, 4 oraz
5 i jeszcze sobie utworzymy drugą zmienną, która nam będzie konieczna, będzie
to index i będzie miał wartość 0. To znaczy, że chciałbym zacząć w
tej iteracji od zera i teraz ta metoda next, pokazywałem
ci przed momentem, że musi zwrócić obiekt, który ma value oraz done. No,
więc nie wystarczyło napisać return, ma zwrócić obiekt, więc to jest obiekt. Tutaj
sobie to średniki dajmy, tutaj gdzie mi edytor podpowiada i zwracamy
obiekt i teraz tak, value, co to będzie. Chciałbym, żeby to było na początku, ta
wartość, później ta, później ta i tak dalej, po kolei z tej tablicy numbers. Napiszemy
sobie zatem numbers i tutaj podstawimy index, czyli
wiemy, że na początku będzie numbers 0, a więc zwróci jedynkę, ale ten index musimy zwiększać, więc
napiszę tutaj plus, plus. Operator takiej post dekrementacji działa tak, że
najpierw tutaj zostanie podstawione 0, a dopiero później zwiększona wartość, więc przy kolejnym
użyciu metody next tutaj będziemy mieli jeden i tam zwróci dwójkę i tak dalej. Mam
nadzieję, że to widzisz, natomiast jeszcze musimy sobie zwrócić czy done ma wartość
true lub false, czyli przeliterowaliśmy przez całą tą tablicę, więc
napiszmy sobie tutaj done, no i true lub false, sprawdzimy to na takiej zasadzie, że
jeżeli index jest równe numbers length, czyli długości
tej tablicy, to będę chciał zwrócić true, czyli już zakończyliśmy wtedy, doszliśmy
do ostatniej, do ostatniego elementu. Jeżeli nie, to zwrócimy false.
W razie czego, na spokojnie sobie to zapauzuj i zobacz, co tutaj się dzieje. Natomiast
nie ma żadnych czarów i teraz jeżeli raz wykonałem metodę iterator next. Zobaczmy. Otworzę
konsole, to będziemy mieli tutaj obiekt, w którym jest done, false
i value 1, więc teraz będziemy chcieli ją jeszcze kilkukrotnie wywołać. Za
drugim razem otrzymamy obiekt, w którym znowu done to jest false, ale value
to jest 2. No, więc teraz powinniśmy mieć 3, 4 i 5.
Zobaczmy. Ostatni powinien mieć wartość 5 i value i
done nadal jest to w false. Tak działają iteratory, że to cały czas jeszcze będzie false. Natomiast
dopiero kiedy kolejny raz skorzystamy z iterator next to value
już będzie miało wartość undefined i done będzie to true, czyli teraz
byśmy mogli napisać pętle, która będzie mogła sobie to sprawdzać i wyświetlać wszystkie
wartości tak długo, aż done nie będzie miało wartości true. No
więc możemy sobie taką pętle zrobić, ja tutaj to wykomentuje, żeby nam tych wartości
nie zmieniło i napisz my sobie pętle for. Napiszmy
sobie zatem for i stworzymy tutaj może zmienną let. Nazwę ją
o i do niej będę chciał przypisać to, co ona na początku zwróci
iterator. Napiszę zatem iterator next i wiesz,
że to nam na początku zwróci już ten obiekt, gdzie value, to będzie jeden, a done to będzie false. Następnie
za każdym, za każdą iteracją chciałbym sprawdzać czy o done
nie jest równe true i na końcu będziemy sobie
robili o równa się iterator next, czyli
nadpisujemy tę wartość i sprawdzamy od nowa. No i w tym momencie pod o będziemy mieli ten wspomniany
obiekt, więc zróbmy console.log o. Jak widzisz, taka pętla nam się wykonała,
ale gdybyśmy się chcieli wgryść tylko do value, to napiszmy sobie o value,
okej. I w ten sposób mamy wszystkie wartości z naszego iteratora. W ten sposób
można byłoby go zrobić za pomocą ES5. Teraz chciałem ci
jednak pokazać jak możemy za pomocą ES6 stworzyć iterator, w jaki sposób
się dodaje iterator do dowolnego obiektu. Wykomentuje
sobie zatem to, co mamy tutaj i poniżej
utworze normalny obiekt, który nazwę it. Jest
to, jak widzisz, zwykły taki literał obiektu i wewnątrz za pomocą takich wyliczonych
właściwości, czyli computed properties, możemy odwołać się do symbol iterator. Pamiętasz
jak mówiłem o symbolach, opowiedziałem ci jak działają Wszystkie z nich. Kilka nawet pokazałem i wspomniałem,
że iterator jest najciekawszy i będziemy z niego często korzystać, więc za pomocą
takiego symbolu dodamy sobie funkcję. Ona będzie właśnie o nazwie, nie
wiemy jakiej, ale możemy się do niej dostać pod symbol iterator. I ta
funkcja, chciałbym, żeby w zasadzie robiła dokładnie to, co widzieliśmy tutaj. Wiem, że na razie
to dziwnie wygląda, ale zapewniam cię, że zobaczysz jak te iteratory prościej
tworzyć jeszcze w późniejszych lekcjach. Natomiast na razie chciałbym abyś zrozumiał koncepcję.
Czyli teraz do zwyczajnego obiektu dodałem sobie iterator w taki sposób. Teraz,
żeby to działało tak samo jak u góry, to tutaj muszę się odwołać do tego it i nie mogę
bezpośrednio wywołać, bo it to jest obiekt, a nie funkcja, dlatego muszę się tutaj odwołać
do symbol iterator i to wywoła tę funkcje. No
i ona zwróci dokładnie to samo, więc wszystko powinno działać tak jak wcześniej i widzisz,
że dokładnie tak jest. Natomiast zapewniam cię, że to co jest ciekawe, to silnik
języka JavaScript, czyli interpreter JavaScriptu będzie potrafił w takim
naszym obiekcie sam znaleźć coś takiego jak symbol iterator i o tym
będziemy sobie jeszcze rozmawiać w kolejnych lekcjach. Mam nadzieję, że na razie tylko zrozumiałeś
koncepcję na czym polega iterator. Otóż, jest jakiś obiekt, na którym wielokrotnie
można wywoływać metodę next i ona powinna zwracać obiekt, w którym jest value oraz
done, value dowolne, a done to jest true lub false i kiedy dona ma
wartość true, wiemy że iteracja powinna się zakończyć i wtedy możemy
zakończyć również pętle. Jeżeli chodzi o te pętle, również będzie to można zrobić w
prostrzy sposób, o czym już niebawem.