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 kontynuujemy jeszcze poznawanie iteratorów dlatego, że chciałbym ci
pokazać, co jeszcze z nimi się wiąże. Zobaczyłeś już, że po pierwsze możemy korzystać na
przykład ich metody next, ale rzadko będziemy to robić ręcznie. Zatem zobaczyłeś,
że pętla for of potrafi wykorzystać wewnętrzny iterator i jest
to już dużo bardziej przyjemne w użyciu. Natomiast okazuje się, że również znany już
ci operator spread korzysta z iterables, czyli
on może być użyty na wszystkim, co zawiera w sobie iterator. Teraz ci pokażę jak to
może wyglądać, przypomnę ci tylko, że na tablicy numbers
już to w tym kursie przerabialiśmy, która ma w sobie wewnętrzny iterator, mogliśmy
wykonać operator spread. Być może pamiętasz, mieliśmy tam taką
metodę, ja tym jak Math.max i do niej trzeba przekazać
poszczególne parametry, więc żeby to zrobić mogliśmy operatorem spread rozstrzelić
tablice numbers i to nam zwróciło najwyższą liczbę, czyli 22.
Zauważ, że mamy tutaj iterator z naszego powszedniego przykładu, który ręcznie utworzyliśmy,
ale pod specjalnym kluczem symbol iterator i to sprawia,
że on poprawnie działa i teraz pytanie, co by było gdybyśmy chcieli zamiast
Math.max numbers zrobić Math.max id czyli
nasz custom'owy obiekt, który sami stworzyliśmy. Pytanie czy operator spread nim
zadziała. Zobaczmy. Okazuje się, że tak i piątka została zwrócona, czyli
podobnie jak pętla for of, ten operator wie, jak długo ma wywoływać
jakby wewnętrzną metodę next, dopóki ona nie zwróci done równa się true,
więc zauważ, że wszystkie te liczby zostały zwrócone. Co ciekawe moglibyśmy
tutaj oczywiście podać sobie jeszcze wartość 100, oprócz naszych liczb i ona
też do Math.max byłaby przekazana i wtedy wynik byłby taki jak tutaj widzisz,
więc zauważ, że to jest super ciekawe, że do dowolnego obiektu możemy dodać iterator
i wtedy nie tylko pętla for of potrafi nam nim działać, ale również operator
spread. Być może się domyślasz, co jeszcze moglibyśmy zrobić z takim
naszym obiektem. Gdybym chciał z niego utworzyć tablice, to mógłbym sobie w końcu napisać
tablica, to jest pusta tablica i do niej rozstrzelić wszystko, co jest w naszym obiekcie
it. W ten sposób utworze tablice z poszczególnymi elementami, które są tutaj. Tutaj
co prawda też była to tablica, ale one są pojedynczo zwracane. Niemniej jednak, to
wcale nie musi być tablica jeszcze się o tym tym kursie przekonasz, ale myślę że i
tak widać, że możesz zwrócić tutaj, co tylko chcesz, a gdybym chciał z tego utworzyć tablice,
mogę skorzystać z takiego zapisu i mam prawdziwą normalną tablice, na
której wszystkie metody będą dostępne. Wspominałem ci, że również string
jest iterables. Można na nim iterować, więc gdybym chciał utworzyć tablice, która
zawiera w sobie poszczególne litery stringu, mógłbym z kolei string rozstrzelić
w taki sposób i znowu będziemy mieli tablice z poszczególnymi literami. Na
koniec pokażę ci jeszcze jedną fajną rzecz. Jak można korzystać z tego operatora i
wiąże się to z tworzeniem tablic. Otóż mieliśmy przykład w 31,
tutaj taki gdzie pobieraliśmy sobie wszystkie
elementy li i mówiłem ci, że od jakiegoś czasu specyfikacja
HTML do takiego konstruktora NodeList dodała metodę
for each, która była normalnie tylko na tablicach w JavaScripcie, więc można z niej
skorzystać, ale co gdybym chciał skorzystać na przykład z metody filter, która jest dostępna na
tablicach. Już ona tutaj nie będzie dostępna. No i w zasadzie możemy to sprawdzić,
nawet tylko próbując się do niej odwołać. Chociaż nie musimy odwołać, bo będzie inaczej undefined
i widzimy, że to nie jest funkcja. Jak zatem na czymś, co
ma w sobie iterator, ale nie jest prawdziwą tablicą, tak jak na przykład obiekt NodeList
wykonać metody dostępne na tablicach. Mam nadzieję, że już się domyślasz. Pokazałem
ci wyżej, że jeżeli utworze tablica i rozstrzelę sobie dowolne elementy,
które mają w sobie iterator, to będę miał tablicę poszczególnymi
elementami. Skoro jest to tablica, to na niej mogę skorzystać z dowolnej metody,
więc skorzystam z metody filter, zaraz będziemy korzystać jeszcze z jednej,
więc sformatuję to w ten sposób, bo można tak zrobić i metoda filter
działa tak, że jeżeli zwrócimy z niej true, to w nowej tablicy się znajdzie dany
element, jeżeli false, to nie. Tutaj możemy sobie przekazać znaną nam już arrow
function, która będzie przyjmować jeden konkretny element li. Pamiętaj,
że tak dokładnie działa funkcja filter na tablicach i będziemy chcieli z tego
zwrócić true lub false na podstawie li text content, czyli w tym
momencie text content to jest pobieranie właściwości tekstowej tego
konkretnego elementu już w obiektowy modelu dokumentu, czyli pobiorę sobie taki
string i będę chciał sprawdzić czy w tym stringu jest dwójka. Jeżeli tak, to zwrócę ten element.
Jeżeli nie, to nie, więc text content zwróci mi string i pokazywałem ci
już w tym kursie, że mamy metodę includes, nowa metoda na stringach, która
pozwoli nam określić czy dany string zawiera jakiś inny podciąg, a
więc chciałbym zapytać czy text content tego li zawiera dwójkę.
Jeżeli tak, to zostanie zwrócone true, dla wszystkich innych elementów będzie to false, więc
filter zwróci mi nową tablicę, dlatego mogę połączyć tutaj kolejne
wywołanie, na tej zwróconej tablicy i tym razem zrobię sobie for each. Znowu
zrobię sobie tutaj funkcję typu arrow, będę miał wszystkie poszczególne li. Będzie
tylko jedno, bo tylko jedno spełniło ten warunek i będę chciał się do niego odwołać i
za pomocą style przypisać mu font-weight na
wartość bold. Jeżeli sobie to odświeżymy, to na stronie okaże się, jak
widzisz, że ten element, który miał dwójkę, od teraz ma przypisaną font-weight
bold, no i zresztą widać, że jest pogrubione. Jak zatem widzisz, genialne
jest to, że operator spread może być wykorzystywany na wszystkim, co zawiera w sobie iterator i jeżeli
chcemy korzystać na przykład z metod tablic, to dany obiekt nie musi zawierać tych metod
takich jak filter czy for each, ale wystarczy, że utworzymy w locie tablice do której
z spread'em rozstrzelimy wszystkie poszczególne elementy właśnie z tego iterable
i następnie możemy bez problemu korzystać z wszystkich metod dostępny na tablicach.