od Podstaw
9 godz. 20 min · JavaScript · Full-stack i Programowanie
Piotr PalarzWeb DeveloperJavaScript to język programowania, który napędza niemal wszystkie strony internetowe. Dopełnia on technologie HTML i CSS, za pomocą których tworzymy strukturę i wygląd dokumentu. Co jednak w sytuacji, gdy chcemy po kliknięciu w wybrany przycisk wyświetlić powiększone zdjęcie lub wczytać dodatkowe dane z serwera? To właśnie w takich sytuacjach przydaje się język JavaScript i tzw. DOM API, dostępne w przeglądarce. Jak się przekonasz, możliwości nowoczesnych przeglądarek w połączeniu z tym językiem są naprawdę ogromne.
Język JavaScript może być używany nie tylko na stronach internetowych. Z tego powodu, w kursie omówimy najpierw najważniejsze konstrukcje tego języka, które są niezależne od platformy uruchomieniowej. Dzięki temu zbudujesz fundamenty niezbędne do tego, by wykorzystać ten język np. w środowisku Node.js. Krok po kroku omówimy sposoby tworzenia zmiennych, dostępne typy danych i operatory. Następnie zobaczysz jak tworzyć tablice i obiekty, z jakich instrukcji warunkowych i pętli możesz korzystać, a także jak tworzyć własne funkcje. Przekazywana wiedza uwzględniać będzie nowości, które pojawiły się w języku wraz z rewolucyjnym standardem EcmaScript 6 (ES6).
Sam język JavaScript to nie wszystko, by tchnąć ducha w strony internetowe. Z tego powodu, przeglądarki internetowe udostępniają tzw. DOM API. To interfejs, który z użyciem języka JavaScript pozwala na manipulację treścią i wyglądem strony. W kursie bardzo dokładnie omówimy czym jest Obiektowy Model Dokumentu, a także jak z nim pracować. Zobaczysz jak tworzyć nowe elementy HTML i wstawiać je na stronę, jak modyfikować ich treść, atrybuty, style czy klasy CSS. Poznasz sposoby na odczytywanie położenia elementu na stronie i jego wymiarów, które będą niezbędne w wielu sytuacjach. Dowiesz się także, jak przypisywać obsługę zdarzeń w przeglądarce, by np. wywołać własną funkcję, gdy ktoś kliknie w wybrany przez Ciebie przycisk.
JSON to popularny format wymiany danych, a Ajax to potoczna nazwa dla asynchronicznych zapytań HTTP, które wysyłać możemy z poziomu kodu JavaScript. Dziś niemal każda strona internetowa wykorzystuje te technologie. W niektórych przypadkach jako dopełnienie podstawowej funkcjonalności witryny, a w innych jako główny motor napędzający stronę. Jeśli kiedykolwiek widziałeś, jak na stronie internetowej jakaś treść "doczytuje" się np. podczas przewijania - widziałeś w praktyce Ajax. W jednym z rozdziałów kursu zobaczysz, jak pracować z tym formatem, a także jak wysyłać wspomniane zapytania do serwera.
Choć kurs który masz przed sobą, jest kursem dla początkujących, to aby zrozumieć jak działa język JavaScript i jak z nim się współcześnie pracuje, omówimy dwa ważne tematy - zarządzanie zależnościami i bundlowanie kodu. Dowiesz się czym jest npm i jak z jego pomocą pobierać paczki gotowego kodu z internetu, a także jak sprawić, by bez trudnu dołączać je do własnego kodu. W tym celu skorzystamy z narzędzia snowpack, które pozwoli nam także na optymalizację kodu przed jego wypuszczeniem w świat. Na tym etapie omówimy również jak działają moduły ESM, pozwalające dzielić kod na mniejsze części.
Kurs podzielony został na możliwie krótkie lekcje, do których w każdej chwili możesz wrócić. Jeśli zatem zapomnisz jak odczytywać wymiary elementu na stronie, szybko odnajdziesz odpowiednią lekcję. Czym jednak była by sama teoria i proste przykłady, bez pokazania, jak połączyć je w całość i wykorzystać w praktyce? Dobra wiadomość jest taka, że w kursie stworzymy aż 5 praktycznych projektów, wykorzystujących zdobytą wcześniej wiedzę. Najpierw napiszemy program losujący Dużego Lotka, następnie dynamiczny pasek postępu przeczytania artykułu, dymek pojawiający się nad elementem po najechaniu na niego myszą, wygenerujemy tabelkę w użytkownikami na podstawie danych JSON, a na koniec tworzymy prosty odtwarzacz wideo, z możliwością pauzowania i przewijania filmu.
Kurs ten jest dla wszystkich osób, które znają już podstawy HTML i CSS i chciałyby przejść poziom wyżej i dodać do swoich stron dynamiczności. Żadna wcześniejsza wiedza z zakresu JavaScript nie jest wymagana, ale zalecana jest podstawowa wiedza z zakresu samego programowania (czym są zmienne, pętle, funkcje itd.). Materiał ten będzie również świetnym odświeżeniem i usystematyzowaniem wiedzy dla osób, które już z tym językiem miały do czynienia. Po przerobieniu tego kursu będziesz gotowy, by poznawać język JavaScript dalej i zacząć korzystać z nowoczesnych frameworków.
W tej lekcji pomówimy sobie trochę o wartościach prymitywnych i o obiektach raz
jeszcze, ale o tym, w jaki sposób są one przekazywane lub nie są przez referencję.
Więc na początek będę chciał sobie utworzyć
jakąś taką stałą, gdzie będziemy mieli powiedzmy firstName
przypiszemy tutaj Jacek
I już wiesz, że taki string jest to wartość prymitywna.
I teraz co by się stało, gdybym chciał
utworzyć drugą stałą i powiedziałbym firstName2
I przypisał bym tutaj wartość firstName.
Powiem Ci co się stanie.
Otóż pod firstName2 będziemy mieli Jacek,
natomiast zagadka na teraz jest taka
co się stanie jeżeli zmienimy wartość firstName.
I w zasadzie tutaj powinniśmy mieć
to zrobione z let, żebyśmy mogli zmieniać te wartości.
Napiszmy firstName równa się Piotr.
Jak myślisz, czy po firstName2 również teraz będzie Piotr?
Zastanówmy się nad tym.
Utworzyliśmy firstName Jacek, firstName2
postawiliśmy tutaj Jacek i następnie firstName zmieniliśmy na Piotr.
Zobaczmy w konsoli co będzie pod firstName2.
Zerknij. Jest to dokładnie Jacek.
Oznacza to tylko tyle, że wartości
prymitywne są kopiowane, a nie przekazywany w jakiś dynamiczny sposób.
A zatem tworząc firstName2 podstawiliśmy tutaj wartość tej zmiennej, czyli Jacek
i działa to identycznie jak byśmy tutaj
wpisali Jacek. A więc nie ma znaczenia, że później zmienimy firstName, w tym miejscu
to się już nie zmieni, bo ta zmienna
została utworzona właśnie z wartością Jacek.
Inaczej jest w przypadku obiektów.
I nie mam tutaj na myśli tylko tych
obiektów, które były w lekcji poprzedniej, czyli takich.
Ale mówiłem Ci, że wszystko, co nie jest wartością prymitywną, jest obiektem.
Czyli na przykład tablice też są traktowane jako obiekt.
A zatem teraz mówiąc o obiektach mam na myśli o wszystkim innym niż wartości
prymitywne. I takie obiekty są przekazywane już przez referencję.
Czyli jeżeli byśmy sobie utworzyli tablicę arr i przypiszemy tutaj np.
1, 2, 3.
Następnie gdybyśmy utworzyli sobie tablicę arr2 i przypiszemy do niej arr
w ten sposób, czyli można powiedzieć, że tutaj też będziemy mieli to samo.
To teraz jeżeli do tej pierwszej tablicy
dodamy sobie czwórkę, to jak myślisz, czy ona będzie też w tej drugiej tablicy?
Zobaczmy.
Dokładnie tak się stało.
I tak się dzieje, dlatego, że obiekty są przekazywane przez referencję.
Czyli tutaj tworząc stałą arr utworzyliśmy
tablicę i można powiedzieć, że zapisaliśmy ją w tej stałej, ale tak naprawdę
zapisaliśmy do niej tylko taki wskaźnik, referencję.
I teraz tworząc kolejną stałą arr2,
jeżeli podstawiliśmy tutaj arr, to skierowaliśmy
można powiedzieć, czy przypisaliśmy tutaj referencję do tej samej tablicy utworzonej
gdzieś w pamięci operacyjnej. Czyli to jest dokładnie ta sama tablica.
A więc później dodając element do tej
pierwszej tablicy, tak naprawdę, kiedy się odwołujemy do arr, jest tutaj zwrócony
wskaźnik na tę tablicę w pamięci i to do niej dodaliśmy czwórkę.
Potem, odwołując się do arr2
my się odwołujemy dokładnie do tego samego
wskaźnika, a więc jest tam przechowywana dokładnie ta sama tablica.
I teraz dokładnie taka sama sytuacja
będzie w przypadku obiektów takich literalnych.
Jeżeli byśmy sobie utworzyli person i wpiszemy tutaj np.
firstName równa się Jan
i teraz jeżeli utworzę drugi identyczny obiekt
i nazwiemy go person2
to są dwa zupełnie inne obiekty.
Tutaj został utworzony obiekt i do person zapisana jego referencja,
tutaj został utworzony taki sam obiekt,
ale jest to osobny obiekt i do niego została zapisana tutaj referencja.
I dlaczego Ci to chcę pokazać?
Właśnie dlatego, że wydawałoby się, że to są identyczne obiekty, ale nie są
identyczne i jeżeli chcielibyśmy je porównać z użyciem operatora Strict
Equality Operator zobaczmy w console.log czy person równa się person2.
Na pierwszy rzut oka one są identyczne,
ale czy one są sobie równe? Zobaczmy.
Zostanie zwrócone false. Bo za każdym
razem, kiedy porównujemy wartości nie prymitywne, tylko właśnie obiekty,
to są porównywane ich referencje, czyli te wskaźniki.
Tak samo byłoby przy tablicach, tak samo przy takich obiektach.
Czyli tutaj jest podstawiona referencja do
obiektu, który został tutaj utworzony i gdzieś w pamięci sobie siedzi.
Tutaj zostaje podstawiona referencja do
tego obiektu, chociaż on przechowuje to samo.
Jest to osobny obiekt i porównywane są tylko te referencje.
Dlatego jeżeli chcesz sprawdzić czy jakieś
dwie zmienne kierują na dokładnie ten sam obiekt, można to zrobić w ten sposób i
udałoby się nam to w przypadku tych tablic.
Czyli zobacz jeżeli sobie zrobimy console.log czy arr jest równe arr2 ?
Tutaj już otrzymamy true. Dlatego, że są porównywane referencje
i tak jak wspomniałem zarówno arr2 jak i arr kierują na dokładnie tę samą tablicę.
Jeżeli natomiast porównujemy w ten sposób wartości prymitywne, takie jak string, to
one są porównywane bezpośrednio. Czyli wtedy jest porównywane.
Czy wszystkie znaki w takim stringu są identyczne,
czy np. jeżeli byłby to typ liczbowy, to czy jest to taka sama liczba?
OK. Podsumowując, jeżeli mamy do czynienia z
obiektami, czyli wartościami nie prymitywnymi, takimi jak tablice czy np.
takie obiekty, to w momencie kiedy przypiszemy je do jakiejś innej stałej
czy zmiennej to tak naprawdę przypisujemy tylko wskaźnik, a więc ciągle mamy do
czynienia z tym samym obiektem. I podobna sytuacja będzie wtedy, kiedy będziemy do
funkcji przekazywać jako argumenty właśnie takie obiekty.
To wewnątrz funkcji nie będzie kopii
takiego obiektu czy takiej tablicy, ale będzie to dokładnie ten sam obiekt.