Cześć, w tym wpisie przedstawię zagadnienie, które stanowi podstawę niemal każdej aplikacji. Nie ma chyba ani jednej aplikacji, która by nie korzystała ze zmiennych.
Czym są zmienne?
Zmienne w programowaniu służą do przechowywania jakiejś porcji danych. Dane te mogą zawierać proste informacje np.: wiek(cyfra), imię(napis), lub bardziej skomplikowane np.: blok kodu odpowiedzialny za sprawdzenie pełnoletności osoby(funkcja).
Tworzenie zmiennych w JS jest bardzo proste i składa się z dwóch etapów.
var age; // deklaracja zmiennej age = 18; // inicjalizacja zmiennej
Proces ten możemy uprościć w do jednej instrukcji.
var age = 18; // deklaracja + inicjalizacja = definicja zmiennej
Powyższy kod tworzy zmienną age o wartości 18. Każde wyrażenie w JS musi zostać zakończone średnikiem. Teraz możemy wyświetlić jej zawartość w konsoli przeglądarki
console.log(age); // 18
Jeśli natomiast będziemy próbować wykorzystać zmienną, której nie zadeklarowaliśmy, zostanie wyrzucony błąd:
console.log(name); // Uncaught ReferenceError: name is not defined
Hoisting zmiennych
W niektórych przypadkach zmienne w JS zachowują się w dosyć nietypowy sposób.
Przyjrzyjmy się poniższemu przykładowi
console.log(myName); // undefined var myName = 'Emil';
Pomimo tego, że zmienną zadeklarowaliśmy póżniej niż ją użyliśmy, kod działa i nie wyrzuca błędu. Zamiast tego wyświetla wartość undefined. Dzieje się tak za sprawą windowania(ang. hoisting) zmiennych. Jak napisałem powyżej proces definiowania zmiennych składa się z dwóch etapów(deklaracji i inicjalizacji). Tak naprawdę proces deklaracji zmiennych jest przenoszony na górę funkcji lub bloku. Czyli poprzedni kod jest równoznaczny z poniższym.
var myName; // deklaracja console.log(myName); // undefined myName = 'Emil'; // inicjalizacja
Typy zmiennych
W Javascript wyróżnia się kilka typów zmiennych:
- boolean – wartość prawda lub fałsz
- null – odniesienie do niestniejącego obiektu w pamięci
- undefined – wartość niezdefiniowana
- number – liczba np.: 54, 5.78, -19
- string – ciąg znaków, napis np.: „Euro 2016”
- object – jest strukturą danych(obiekt, tablica), która może w sobie zawierać pozostałe typy zmiennych
Przykład użycia typów zmiennych.
var booleanType = true; var nullType = null; var undefinedType; var numberType = 30.5; var stringType = 'EURO 2016'; var objectType = { property1: 'hello', property2: 45 }; console.log(booleanType); console.log(nullType); console.log(undefinedType); console.log(numberType); console.log(stringType); console.log(objectType); console.log(objectType.property1);
Jak sprawdzić typ zmiennej?
W sytuacji, gdy nie wiemy jakiego typu mamy zmienną, z pomocą przychodzi operator typeof. Jego użycie jest bardzo proste. Spójrzmy.
console.log(typeof 45); // => number console.log(typeof 'Lublin'); // => string console.log(typeof true); // => boolean console.log(typeof [12, 45, 56]); // => object console.log(typeof new Date()); // => object console.log(typeof null); // => object console.log(typeof undefined); // => undefined console.log(typeof alert); // => function
Jak widzimy większość działań zwraca przewidywany wynik. Jednak dla wartości null zwracana jest wartość ‚object’.
Zasięg zmiennych
Zasięg zmiennych jest to termin, który oznacza, z jakiego miejsca w naszym kodzie mamy dostęp do danej zmiennej. W Javascript nowy zasięg(ang. scope) jest tworzony za pomocą funkcji. Jeśli zdefiniujemy zmienną wewnątrz funkcji, nie będziemy mieć do niej dostępu na zewnątrz.
function test() { var a = 'zmienna a'; } console.log(a); // Uncaught ReferenceError: a is not defined
Inaczej ma się sprawa z instrukcjami blokowymi takimi jak if czy for.
Przyjrzyjmy się zatem następnemu przykładowi.
if( 5 > 3) { var a = 'zmienna a'; } console.log(a); // 'zmienna a'
Jeśli instrukcja warunkowa spełni warunek, to wewnątrz bloku tworzona jest zmienna a. Następnie wyświetlamy zawartość zmiennej a. W innych językach programowania taki przykład spowodowałby błąd, gdyż zmienna utworzona w ten sposób byłaby zmienną blokową( jest dostępna tylko w tym bloku, między klamrami). Natomiast w Javascript kod wykona się bez problemu. Dzieje się tak, gdyż bloki w JS nie tworzą nowego zasięgu dla zmiennych. Błąd ten naprawiono w nowszej wersji Javascript, wprowadzając nowy sposób deklarowania zmiennych.
- let – deklaruje zmienna blokową
- const – deklaruje stała (nie można zmienić jej wartości)
if( 5 > 3) { let a = 'zmienna a'; } console.log(a); // Uncaught ReferenceError: a is not defined
Jak widzimy, słowo kluczowe let tworzy rzeczywiście zmienną blokową, która nie jest dostępna na zewnątrz bloku. Jednak najnowsze funkcje języka Javascript nie są wspierane przez wszystkie przeglądarki. Aby móc z nich korzystać, należy używać kompilatora JS takiego jak np.: Babel.
Operacje na zmiennych
Zmienne w naszej aplikacji możemy poddawać różnym operacjom min. matematycznym.
Wykonywanie tych rzeczy jest proste, choć należy pamiętać o kilku wyjątkach.
Operatory w JS:
- + dodawanie
- – odejmowanie
- / dzielenie
- * mnożenie
- % module (wyznacza resztę z dzielenia)
var a = 10; var b = 5; var c = 3; var d = '6'; console.log(a + b); // 15 console.log(b - c); // 2 console.log(a / b); // 2 console.log(a % c); // 1 console.log(a + d); // 106 UWAGA! console.log(d + a); // 610 UWAGA! console.log(a - d); // 4 console.log(d - c); // 3
Jak widzimy większość przykładów działa prawidłowo, jednak gdy chcemy dodać jedną cyfrę do drugiej, króra jest napisem, robi się coś dziwnego. Zamiast 16, w obu pzypadkach wychodzi ‚sklejenie’ dwóch liczb. Dzieje się tak dlatego, że cyfra zamieniana jest na napis, a napis jest póżniej łączony. Natomiast przy odejmowaniu następuje zamiana napisu na cyfrę i wynik jest prawidłowy.
Do zamiany napisu na liczbę służą dwie funkcje
- parseInt(liczba, podstawa)
- parseFloat(liczba)
Funkcja parseInt jako pierwszy parametr przyjmuje napis, jako drugi podstawę systemu liczbowego(np.: dla liczby 5 w systemie dziesiętnym podstawa będzie 10, a dla liczby 0xF w systemi szesnastkowym bedzie to liczba 16)
Funkcja parseFloat zamienia napis na liczbę zmiennoprzecinkową.
console.log(parseInt('12', 10) + 6); // 18 console.log(parseInt('0xF', 16) ); // 15 console.log(parseFloat('1.57')) // 1.57
Jeśli do funkcji przekażemy napis, który nie jest cyfrą(np.: EURO2016), zostanie zwrócona wartość NaN(Not a Number)
console.log(parseInt('EURO2016', 10)); // NaN
To już koniec. Mam nadzieję, że wpis się podobał. Zachęcam do komentowania.
Narazie!