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 zajmiemy się kolejną niezwykle przydatną możliwością
dostępną w ES6 i z angielskiego ona nazywa się destructuring, a po
polsku możemy powiedzieć, że jest to dekompozycja. W tej lekcji zajmiemy się taką
pozycją obiektów, więc przejdźmy sobie od razu do kodu i chciałbym tutaj utworzyć
sobie taki prosty obiekt i teraz czym jest dekompozycja. Otóż,
jest to można powiedzieć wyciągnięcie odpowiednich danych z jakiejś
struktury. W tym przypadku naszą strukturą będzie ten oto obiekt i chciałbym
wyciągnąć te dane i zapisać je w zmiennych, bo to jest tutaj istotne i co ciekawe
wiele języków programowania już wcześniej posiadało taką możliwość, a
w JavaScripcie nie było możliwości takiego destructuringu w łatwy sposób, więc
teraz gdybym chciał utworzyć trzy zmienne, które zawierałyby by w sobie firstName, lastName
i age, to jak musiałbym to zrobić, można powiedzieć ręcznie, za
pomocą var, czy let tutaj nie ma to znaczenia, ale musiałbym utworzyć zmienną firstName
i napisać person firstName. Teraz musiałbym utworzyć pod
spodem kolejną zmienną lastName i odwołać się do person
lastName. No i tak dalej i zmienną age, byłoby to
person, age. Sporo pisania, tylko po to, żeby z takiego obiektu wyciągnąć
sobie wszystkie dane. Zakładamy, że ten obiekt przyszedł do nas
w formie na przykład jakiegoś jsona z internetu, pobralibyśmy
sobie to Ajaxem, zostałoby to zamienione na obiekt. Więc powiedzmy mam go po prostu w
jakiejś zmiennej i chciałbym w tym zakresie, w którym jestem wyciągnąć
z niego jakieś dane, niekoniecznie wszystkie i utworzyć na ich podstawie zmienne, tak
musiałbym to zrobić do tej pory w języku JavaScript. Teraz jednak
możemy zrobić łatwiej wykomentuje sobie wszystko co było w tym miejscu, chociaż może zróbmy
sobie tego console.log, bo zaraz nam to będzie potrzebne, lastName i age. No
i w konsoli będzie to wyglądać następująco i teraz sobie to dopiero wykomentuje,
co sprawiłoby, że mielibyśmy błąd, więc to też wykomentuje i pomiędzy
tym pokażę ci jak skorzystać z destructuring'u obiektów. Napiszemy
sobie let i postawię taki oto obiekt. No i od razu wydawałoby się, że
nie jest to poprawne, bo tutaj powinna być nazwa zmiennej, a nie obiekt. Taki
obiekt może się znaleźć przecież dopiero po tej stronie przypisania. Jednak wystarczy
w destructuring'u może tak być, ale nie może być tutaj pusty, więc w tym obiekcie,
czy postawimy spację czy nie, nie ma to znaczenia, więc można je postawić. Napiszę
sobie firstName, lastName i age. Jakkolwiek
dziwnie to wygląda, po tej stronie musimy podać obiekt, z którego to zostanie wyciągnięte,
więc napiszę person i teraz sobie odkomentujemy console.log i
zobaczymy, że mamy poprawne wartości, czyli co tutaj się
stało. Otóż utworzyliśmy sobie trzy zmienne, dokładnie tak samo jak byśmy je
utworzyli za pomocą let, tutaj wyżej i pod tymi zmiennymi będzie
się znajdować dokładnie to samo co wcześniej, czyli pisząc coś takiego wyciągamy
sobie z tego obiektu, który podamy po tej stronie. Dokładnie firstName, lastName czy
age. Gdybym chciał wyciągnąć sobie tylko firstName, to tutaj korzystając
z tego oczywiście pojawi się błąd, że lastName nie jest zdefiniowane, aczkolwiek widzisz,
że możemy to zrobić. Jeżeli chcesz wyciągnąć sobie wszystkie te trzy rzeczy, to
pisze to w taki sposób. Generalnie, jeżeli korzystamy z destructuring'u obiektów,
to będziemy pisać coś, co wygląda jak obiekt, a kiedy będziemy w
kolejnej lekcji korzystać z destructuring'u tablic, to tutaj będzie taki tablicowy
zapis. Można zatem powiedzieć, że tutaj po tej lewej stronie przypisania, tworzymy
coś co wygląda jak wzór, na podstawie, którego chcemy rozłożyć obiekt
podany w tym miejscu. Jest tutaj jedna bardzo ważna uwaga, otóż
jeżeli coś, co mamy po prawej stronie będzie ewoluowało do undefined albo
null to będziemy mieli problem i kiedy tak by się mogło stać. Wyobraź sobie, że
mamy jakąś funkcję o nazwie getData i że
ona by nam zwracała teoretycznie jakiś obiekt, ale powiedzmy, że szukałoby
go w bazie danych i jeśli czegoś by nie było, to zwraca nam na przykład null albo
jeżeli nic nie zwrócę jest to undefined i w tym miejscu przecież oczywiście, że mogę podstawić wywołanie
funkcji getData, bo to oznacza, że tutaj przypisze to, co ona zwróci i zobacz
co się stanie jeżeli ona zwróci null. Będziemy mieli błąd, z tego powodu, że
destructuring próbuje z tego co zostało zwrócone wyciągnąć sobie właściwości
firstName, lastName i age, dlatego ważne jest tutaj, aby zawsze podawać również
domyślny jakiś obiekt. W przypadku destructuring'u obiektów. Jeżeli nie
mamy stuprocentowej pewności, że getData zwróci chociażby pusty obiekt, zauważ,
że wtedy nie byłoby problemu. Zmienne po prostu mają wartość undefined i to też jest
ważne. Gdybym tutaj zwrócił znowu
null, a w tym miejscu napisał person i chciał z niego wyciągnąć jeszcze coś
czego tutaj nie mieliśmy, firstName, lastName i age gdybym chciał wyciągnąć na przykład
job, to pytanie, co będzie pod job. Będzie
tam po prostu undefined i nie będzie żadnego błędu. Natomiast wracając jeszcze do
tego, co mamy tutaj jeżeli nie mamy pewności, że funkcja, którą tutaj wywołujemy na
100% zwróci nam jakiś przynajmniej pusty obiekt, to możemy skorzystać z takiego operatora
i postawi tutaj pusty obiekt. Wiesz, że jeżeli tutaj zostanie zwrócona wartość
fałszywa, na przykład null, to ten operator przejdzie na swoją prawą stronę i to
co jest tutaj podstawie w to miejsce i dopiero wtedy jakby wracamy tutaj i destructuring
ma miejsce próbując z to z putego obiektu wyciągnąć te właściwości, a że ich tam nie
ma to zmienne będą miały wartościami undefined, ale przynajmniej nie będzie błędu. Zobaczmy
czy tak rzeczywiście się stanie i jak widzisz mamy teraz, że job jest niezdefiniowane
jeszcze to usuniemy. No i nie mamy błędu. Mamy trzy razy undefied pod każdą
z tych zmiennych. Pamiętaj, że te zmienne zachowują się
dokładnie tak samo jakbyś je utworzył z użyciem let. Możesz tutaj napisać var i
możesz tutaj napisać const. To się tyczy wszystkich tych zmiennych, które się tutaj
pojawiają. Teraz kolejna rzecz. Co by było gdybyś chciał utworzyć
zmienną o innej nazwie, czyli tutaj wyciągaliśmy sobie person firstName i
gdybym chciał nazwać zmienną fName. Wiesz, że normalnie zrobimy to w ten sposób. Pytanie
czy przy deststructuring'u można to zrobić. Odpowiedź jest taka, że można i robi
się to w ten sposób, że tutaj po dwukropku podajemy sobie nazwę zmiennej jaka
zostanie utworzona i znowu to wygląda dziwnie, bo jakby odwrotnie
zupełnie, jeżeli tworzymy obiekt to nazwa właściwości jest po lewej
stronie, a wartość po prawej, a tutaj jest jakby troszeczkę na odwrót. Natomiast
po prostu trzeba się tego nauczyć, przyzwyczaić do tego i teraz gdy generalnie
zadziała to tak, że zmienna firstName nie będzie istnieć. Będziemy mieli błąd, że nie została
zdefiniowana, ale istnieje teraz fName, czyli jeżeli chcesz wyciągnąć
z obiektu właściwości firstName to piszesz ją tutaj i jeżeli chcesz utworzyć
lokalną zmienną z użyciem let, która tę wartość będzie przechowywać to stawiasz
ją w tym miejscu. Jeżeli natomiast nie chcesz zmieniać nazwy, to wystarczy, że pozostawisz
firstName. Nie musisz pisać firstName równa się firstName, ale to jest dokładnie to samo,
czyli tutaj wygląda to podobnie jak w tym skróconym zapisie obiektów, które ci
już pokazywałem. Jeżeli właściwości miałyby się tutaj powtarzać czy
te nazwy, to nie musisz pisać ich po dwukropku. Natomiast, jeżeli chcesz nazwać
zmienną lokalną tutaj inaczej, to musimy napisać fName. Zobaczymy
teraz. Nie ma błędu, wszystko jest okej. Natomiast tutaj getData. Zróbmy
sobie po prostu person. No i zobaczysz, że pod fName
rzeczywiście znalazło się Jan, czyli w ten sposób możesz sobie wyciągnąć tylko to,
co interesuje cię z danego obiektu i zmienne możesz nazwać inaczej niż właściwości,
które znajdują się w takim obiekcie. Jeszcze jedną
ciekawostkę jest to, że zmienne mogą być utworzone wcześniej, czyli wyobraź sobie,
że tutaj byśmy wcześnie utworzyli zmienną firstName albo
w tym przypadku zróbmy fName, lastName i age. Mamy
je utworzone wcześniej i pytanie czy wtedy można skorzystać z destructuring'u. Okazuje
się, że tak. Musimy sobie wziąć taki zapis i nie korzystać na początku ze
słowa let. Natomiast tutaj pojawi się problem, będzie mieli błąd.
Zaraz zobaczysz dlaczego unexpected token, znak równości,
z tego powodu, że taki blok jest traktowany przez interpreter jakbyśmy utworzyli
sobie nowy blok kodu. Żeby zatem ten interpreter wiedział, że
tak naprawdę chodzi nam o destructuring, to w przypadku obiektów musimy to
wyrażenie opleść sobie w tak takie nawiasy okrągłe i w
tym momencie nie będzie już błędu, jak widzisz Jan Kowalski 49, czyli
gdybyś miał wcześniej zadeklarowane już zmienne, a później chciał do nich
przypisać wartość właśnie wybraną z jakiegoś obiektu, możesz to również
zrobić w taki sposób. No i w tej lekcji to już będzie wszystko, mam nadzieję, że dobrze
zrozumiałeś i że widzisz jak działa destructuring. Generalnie będzie to bardzo przydatne
na przykład, kiedy będziemy mieli jakieś obiekty utworzone z pobranego json'a,
czyli z danych typu json i wtedy będziemy chcieli z nich coś wyciągnąć i zapisać
sobie w lokalnych zmiennych, natomiast destructuring może być jeszcze dużo bardziej zaawansowany,
o czym przekonasz się w kolejnych lekcjach, ale najpierw zerkniemy na to, w jaki
sposób możemy wykonywać podobną operację na tablicach.