Zmienne stanowią kluczowy element w programowaniu, niezależnie od języka. Każdy program, w trakcie swojego działania, musi przechowywać dane. Zmienne, jak sama nazwa wskazuje, pozwalają na przechowywanie informacji, które mogą ulegać zmianom w trakcie życia programu. Oprócz zmiennych istnieją także stałe, których wartości, w przeciwieństwie do zmiennych, pozostają niezmienne.
Od wersji ECMAScript 6 (ES6), wprowadzono nowe słowa kluczowe do deklarowania zmiennych: let
i const
. Użycie tych słów kluczowych wymaga ich wcześniejszej deklaracji. Przed wprowadzeniem ES6, jedynym słowem kluczowym do deklarowania zmiennych było var
, które nadal jest częścią języka, ale ma nieco inne właściwości, szczególnie jeśli chodzi o zakres (scope) zmiennej.
let
Deklaracja zmiennej za pomocą let
pozwala na późniejszą zmianę jej wartości. Przykłady deklaracji:
let message;
//deklaracja kilku zmiennych
let error, infoMessage;
Zmienne zadeklarowane, ale niezainicjowane, mają domyślnie wartość undefined
. Zalecaną praktyką jest jednak przypisanie wartości początkowych:
let message = "Zapis poprawny!";
//deklaracja kilku zmiennych
let error = "Błąd zapisu", infoMessage = "Podaj hasło";
Deklaracja wielu zmiennych w jednej linii jest możliwa, ale może wpływać negatywnie na czytelność kodu. Wartość zmiennej let
można zmieniać, również na wartości różnych typów:
let message = "Zapis poprawny!"; //wartośc początkowa String
message = 123; // zmiana na Number
message = true; // zmiana na Boolean
message = {name: "Tom"}; // zmiana na Object
const
W przeciwieństwie do let
, zmienne zadeklarowane jako const
muszą być inicjowane w momencie deklaracji i ich wartości nie mogą być później zmieniane:
const MESSAGE_SUCCESS = "Zapis poprawny";
//próba zmiany wartości:
MESSAGE_SUCCESS = "Zapis błedny";
// rzuci błędem:
// Assignment to constant variable.
var
Choć var
jest nadal częścią JavaScript, jego użycie jest obecnie zalecane tylko w starszych skryptach. Różni się od let
w kilku kluczowych aspektach:
- Zakres zmiennej
var
jest ograniczony do funkcji, w której została zadeklarowana. - Zmienna
var
może być użyta przed jej deklaracją ze względu na zjawisko hoistingu. - za pomocą var można kilkakrotnie deklarować zmienną
- Zmienne globalne zadeklarowane za pomocą
var
stają się częścią globalnego obiektuwindow
.
var saveStatusMessage = "Zapis poprawny";
console.log(window.saveStatusMessage); // "Zapis poprawny"
let deletedStatusMessage = "Usunięto poprawnie";
console.log(window.deletedStatusMessage); // undefined
Zasięg zmiennych
Zakres zmiennej określa jej widoczność i dostępność w różnych częściach kodu. W JavaScript, let
i const
mają zakres blokowy, co oznacza, że są dostępne tylko wewnątrz bloku kodu (np. wewnątrz klamer {}
). Jeśli zmienna jest zadeklarowana poza jakimkolwiek blokiem, staje się zmienną globalną, dostępną w całym kodzie.
Przykład:
// Globalna zmienna
let userName = 'Alex';
function displayUserPreferences() {
// Lokalna zmienna
let themeColor = 'dark';
// Stała lokalna
const FONT_SIZE = '16px';
console.log(userName + " prefers a " + themeColor + " theme with font size " + FONT_SIZE);
// Wynik: 'Alex prefers a dark theme with font size 16px'
// Zmiana lokalnego motywu
themeColor = 'light';
}
displayUserPreferences();
console.log(userName + " global preference check.");
// Wynik: 'Alex global preference check.'
console.log("Outside function, theme is " + themeColor);
// Błąd: 'themeColor' nie jest zdefiniowane poza funkcją
// ReferenceError: themeColor is not defined
Zmienne jako referencje do pamięci
W JavaScript, zmienne można rozumieć jako referencje do miejsc w pamięci RAM komputera. Kiedy tworzymy zmienną i przypisujemy jej wartość, nie przechowujemy bezpośrednio tej wartości w zmiennej. Zamiast tego, zmienna „wskazuje” na miejsce w pamięci, gdzie ta wartość jest przechowywana.
W JavaScript, sposób działania przypisania zmiennych zależy od typu danych, z którymi pracujemy. Rozróżniamy tutaj dwa główne typy danych: proste (takie jak liczby, wartości logiczne, łańcuchy znaków) i złożone (takie jak obiekty, tablice).
Dla Typów Prostych:
Gdy przypisujemy wartość jednej zmiennej do innej dla typów prostych, JavaScript tworzy nową kopię tej wartości. Oznacza to, że każda zmienna przechowuje osobną kopię wartości w swoim własnym miejscu w pamięci. Zmiany dokonane na jednej zmiennej nie wpływają na drugą.
Przykład:
let a = 10;
let b = a; // Tworzy nową kopię wartości 10
b = 20; // Zmiana wartości b nie wpływa na a
console.log(a); // Wynik: 10
Dla Typów Złożonych:
W przypadku typów złożonych, takich jak obiekty i tablice, przypisanie zmiennej do innej zmiennej nie tworzy nowej kopii obiektu lub tablicy. Zamiast tego, obie zmienne wskazują na ten sam obiekt/tablicę w pamięci. To oznacza, że zmiany dokonane za pomocą jednej zmiennej są odzwierciedlane w drugiej, ponieważ obie zmienne odnoszą się do tego samego adresu pamięci.
Przykład:
let originalNumber = 10;
let copiedNumber = originalNumber; // Tworzy kopię wartości
let originalObject = { name: "Alex" };
let copiedObject = originalObject; // Nie tworzy nowego obiektu, tylko kopiuje referencję
copiedObject.name = "Chris";
console.log(originalObject.name); // Wynik: "Chris"
Nazwy zmiennych i stałych
Ograniczenia Techniczne:
- Nazwy mogą zawierać litery, cyfry, znaki
$
i_
. - Pierwszy znak nazwy zmiennej nie może być liczbą.
Konwencje Nazewnictwa:
- Mimo że dozwolone jest użycie znaków UNICODE, czyli poprawną nazwa zmiennej by było np
promień
, ale zaleca się unikanie skomplikowanych lub nietypowych znaków w nazwach. - Nazwy powinny dokładnie opisywać zawartość zmiennej, unikając niejasnych lub ogólnych terminów jak
a
,b
,x
,data
,value
,money
. - Dla zmiennych składających się z wielu słów, zalecana jest notacja camelCase, np.
calculateTotalPrice
. - Wielkość liter ma znaczenie:
name
różni się odNAME
. - Dla stałych zaleca się użycie całkowicie wielkich liter, np.
NAME
lubDEFAULT_COLOR
dla nazw składających się z kilku słów, oddzielanych znakiem_
.