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 pozostajemy jeszcze w tematyce EcmaScript 5 dlatego,
że będę chciał ci pokazać w jaki sposób działają zmienne utworzone
ze słowem kluczowym var oraz czym jest tak zwany hoisting. Jeżeli jeszcze tego
nie wiedziałeś lub być może zapomniałaś sobie o takim działaniu, to będę chciał ci to przypomnieć,
bo będzie to bardzo ważne w kontekście kolejnych lekcji, gdzie będziemy
już rozmawiać o nowych rzeczach w EcmaScript 6, więc w tej lekcji jeszcze ES5.
Mam taką prostą stronę tutaj przygotowaną w zasadzie na niej nic
nie będzie oprócz naszego skryptu, którego podglądamy tutaj. Przypominam, że w razie czego
możesz sobie to ukrywać i pokazywać, jeżeli te skrypty będą dłuższe i przejdziemy sobie
do skryptu. Zauważ, że ja tutaj utworzyłem taką funkcję anonimową,
aby ona nam ograniczała zakres zmiennych, czyli jeżeli utworze sobie standardowo
ze słowem kluczowym var jakąś zmienną, na przykład firstName i napiszemy
tutaj Jan, to ona jest widoczna wyłącznie w tej funkcji i ważne
jest tutaj to, aby zapamiętać, że zmienne jeszcze EcmaScript 5
mogą być ograniczone wyłącznie funkcją, czyli zakres zmiennych jest stworzony
dla każdej nowej funkcji i wyłącznie funkcja może utworzyć nowy zakres zmiennych. Na
przykład blok kodu, taki jak if, jeżeli tutaj utworze zmienną, ona
będzie widoczna również poza tym blokiem kodu. Tak więc, to jest istotne, że funkcja
ogranicza i tworzy nowy zakres zmiennych. Utworzyłem sobie zatem
zmienną słowem kluczowym var, czyli to co znamy do tej pory ES5. Natomiast,
co by się stało, gdybym chciał skorzystać z tej zmiennej, zanim ona została utworzona. Napiszę
tutaj console.log firstName, zapisze, przejdziemy do przeglądarki, która automatycznie
się odświeżyła i otworzę konsolę i w konsoli możemy zobaczyć wartość undefined. To
oznacza, że nie mamy żadnego błędu, ale zmienna firstName w tym
miejscu miała wartość undefined. Natomiast identyczny console.log poniżej sprawi,
że będziemy mieli już wartość Jan. Dlaczego tak się dzieje? Otóż dokładnie
z tego powodu, że tutaj ma miejsce zjawisko tak zwanego hoistingu,
czyli wynoszenia deklaracji zmiennych na samą górę danego zakresu,
czyli w tym przypadku nowym zakresem jest ta funkcja, czyli
na samą górę można powiedzieć, że w to miejsce jest wynoszona taka zmienna,
czyli interpreter JavaScript'u, w tym przypadku, jeżeli to byśmy sobie usunęli,
zachowuje się w taki sposób jak byśmy napisali var firstName. Wiem,
że taka zmienna miałaby wartość undefined, a później jak byśmy ją nadpisali
i w zasadzie ten console.log może tutaj zostać. Czyli to, co mieliśmy przed
momentem, dla interpretera wygląda w ten sposób. Dlatego tutaj nie ma błędu.
Możemy skorzystać ze zmiennej firstName, ale ma ona wartość undefined. Zauważ,
że efekt jest dokładnie taki sam. Czyli zmienne są zawsze wynoszone na samą górę zakresu,
niezależnie od tego, gdzie zostały w tym zakresie utworzone. Dopiero później
jednak przypisywane są do nich wartości. Wróćmy sobie zatem
do takiego zapisu, no i będzie to działać dokładnie tak samo. Ważne
jest, żeby wiedzieć, że funkcje również są hoistowane, czyli wynoszone na górę. Dlatego
gdybym utworzył taką zmienną getLastName i ona
by zwracała jakieś nazwisko, na przykład Kowalski, to
mogę z niej skorzystać już w tym miejscu, czyli gdybym sobie to wyciął i chciał tutaj
skorzystać z firstName. Wiemy, że jest to możliwe i do tego sobie po prostu dodać spację
oraz to co zwróci funkcja getLastName, to okaże się, że
wszystko jest w porządku, czyli to działa, a więc funkcje nie tylko są wynoszone
na samą górę zakresu, ale również od razu można z nich korzystać, czyli to jest
pewnego rodzaju różnica. Zmienne są wynoszone, ale mają wartość undefined. Funkcje
są wynoszone i działają poprawnie. Teraz chciałbym ci pokazać
jeszcze jedną rzecz, o której być może nie wiedziałeś. Gdybyśmy utworzyli blok if i
tutaj byłby jakiś warunek, ale ja na sztywno wpiszę tutaj true i w
tym bloku chciałbym utworzyć zmienną, na przykład, lastName Kowalski, to
pewnie nie będzie dla ciebie niespodzianką, że tutaj możemy skorzystać z lastName. Jest
to normalne, dlatego właśnie wspominałem o tym, że tylko funkcje mogą tworzyć
nowe zakres zmiennych. Taki blok kodu tego za nas nie zrobi, więc spróbujmy
sobie to wyświetlić i widzimy, że pojawiła nam się wartość Kowalski. Natomiast co
by się stało gdybyśmy tutaj mieli warunek nieprawdziwy, czyli if false. Wiemy,
że cały ten blok w ogóle nie powinien się wykonać, czyli taka zmiana nie powinno zostać
utworzona. Co zatem będzie pod lastName? Czy będzie to błąd? Zapiszmy
i zobaczymy. Okazuje się, że jest tutaj wartość undefined, ale gdybyśmy
w ogóle nie mieli tego bloku czy w zasadzie tej instrukcji, to będziemy mieli
błąd, że lastName nie jest zdefiniowane. Znowu tutaj widzimy to zjawisko
hoistingu, o którym wspomniałem, które działa w tak w przewrotny sposób, że nawet jeżeli
tutaj mamy wartość false i przeglądarka czy w zasadzie interpreter
javaScript'u nawet z góry by wiedział, że tutaj jest na sztywno wpisane false, czego się nie da zmienić. Tak
czy siak, utworze taką zmienną, wyniesie ją na samą górę i przypisze jej wartość
undefined. Po prostu nigdy nie zmienimy tej wartości na Kowalski, ale
również nie pojawi się tutaj błąd z tego tytułu, że taka zmienna jest niezdefiniowana.
Zobaczmy raz jeszcze wartość undefined. No
i ostatnia rzecz w tej lekcji, którą chciałbym ci pokazać lub być może przypomnieć jest taka, że
jeżeli utworzymy sobie zmienną globalną, nieograniczoną żadnym innym zakresem, czyli
tutaj mamy jakieś zakres, ale poza tym zakresem w tym skrypcie jeżeli utworze jakąś zmienną,
na przykład firstName i przypisze jej wartości Jan.
Może na razie ją wykomentuję, żeby ci pokazać, że nie mogę
tutaj wpisać firstName. Nie ma takiej zmiennej, mam błąd. A jeżeli ją utworzę poza
tym blokiem to ona będzie globalna, to znaczy, że mogę teraz się tutaj do niej odwołać. Tutaj
również nie jest to nic nadzwyczajnego, ale ważne jest to, że jeżeli zmienna została utworzona w
globalnym zakresie, to zostaje dodana jako właściwość obiektu globalnego.
W przypadku przeglądarki obiektem globalnym takim nadrzędnym jest window, więc
jeżeli napisze window firstName, to okazuje się, że mamy tę samą wartość, czyli
napisanie w globalnym zakresie var first name, to tak samo jak byśmy napisali
window firstName i przypisali tutaj wartość Jan.Jest
to rzecz niezwykle ważna do zapamiętania w przypadku korzystania ze słowa
kluczowego var. No właśnie w EcmaScript5 . Ono w EcmaScript 6
nadal jest dostępne i nadal działa tak samo. Natomiast pojawiły się dwa nowe
słowa, które pomogą nam tworzyć zmienne i stałe i o nich porozmawiamy sobie
w kolejnych lekcjach.