Typy danych w JavaScript
1. Wprowadzenie
JavaScript jest językiem dynamicznie typowanym, co oznacza, że nie musisz deklarować typu zmiennej przy jej tworzeniu — interpreter automatycznie określa typ na podstawie przypisanej wartości.
Przykład:
Typ danych może więc zmienić się w trakcie działania programu. Zrozumienie typów danych jest kluczowe, ponieważ wpływają one na:
- działanie operatorów (
+,==,===), - konwersje wartości,
- zachowanie funkcji i porównań.
2. Podział typów danych
W JavaScript istnieją dwa główne rodzaje typów danych:
- Typy prymitywne (Primitive types)
- Typy złożone (Reference types)
3. Typy prymitywne
Typy prymitywne przechowują pojedyncze wartości, a nie referencje. Są niezmienne (immutable) — nie można ich zmodyfikować po utworzeniu (zmiana wartości oznacza stworzenie nowej).
Lista typów prymitywnych:
stringnumberbooleanundefinednullsymbolbigint
3.1 String – łańcuchy tekstowe
Służy do przechowywania tekstu w cudzysłowach:
Cechy:
- Można używać szablonów (template literals) z backtickami
`...`i interpolacją${}. - Łańcuchy są niemutowalne — operacje takie jak
tekst1.toUpperCase()tworzą nowy string.
Przykład:
3.2 Number – liczby
W JavaScript wszystkie liczby (całkowite i zmiennoprzecinkowe) należą do jednego typu:
Cechy:
- Liczby całkowite i zmiennoprzecinkowe nie mają oddzielnych typów.
-
Istnieją specjalne wartości:
-
Infinity -InfinityNaN(Not a Number)
Przykład:
3.3 Boolean – wartości logiczne
Reprezentuje dwa stany: true lub false.
Przykład:
Falsy i truthy wartości:
Niektóre wartości są automatycznie konwertowane na true lub false:
- Falsy:
0,"",null,undefined,NaN,false - Truthy: wszystko inne (np.
"tekst",1,{},[])
3.4 Undefined
Oznacza, że zmienna została zadeklarowana, ale nie ma przypisanej wartości.
Przykład:
Zmienna undefined często pojawia się, gdy:
- zapomnimy przypisać wartość,
- funkcja niczego nie zwraca (
returnbez wartości).
3.5 Null
Oznacza brak wartości lub celowe wyczyszczenie zmiennej.
Przykład:
Uwaga: typeof null zwraca "object", co jest błędem języka odziedziczonym z wczesnych wersji JS.
3.6 Symbol
Typ wprowadzony w ES6 – reprezentuje unikalną wartość identyfikatora.
Przykład:
Symbole są często używane do tworzenia unikalnych kluczy obiektów, których nie można przypadkowo nadpisać.
3.7 BigInt
Typ wprowadzony w ES2020 – pozwala przechowywać liczby większe niż 2⁵³ - 1, które nie mieszczą się w Number.
Przykład:
Wszystkie liczby typu BigInt kończą się literą n.
4. Typy złożone (referencyjne)
Typy te przechowują referencję (adres w pamięci), a nie wartość. Oznacza to, że dwie zmienne mogą wskazywać na ten sam obiekt.
Podstawowe typy referencyjne:
- Object
- Array
- Function
- Date, RegExp, Map, Set (inne obiekty wbudowane)
4.1 Object – obiekty
Obiekty są kolekcjami par klucz-wartość.
Przykład:
Obiekty można modyfikować nawet po ich przypisaniu do zmiennej const, ponieważ const chroni tylko referencję, nie samą zawartość.
4.2 Array – tablice
Tablice to uporządkowane listy wartości:
Cechy:
- Indeksowanie od 0,
- Mogą zawierać różne typy danych,
- Mają wiele metod:
push(),pop(),map(),filter(),forEach().
4.3 Function – funkcje jako obiekty
W JavaScript funkcje są pierwszoklasowymi obywatelami (first-class citizens), czyli:
- mogą być przypisywane do zmiennych,
- przekazywane jako argumenty,
- zwracane z innych funkcji.
Przykład:
5. Sprawdzanie typu danych
Operator typeof pozwala sprawdzić typ wartości:
6. Konwersje typów
JavaScript automatycznie konwertuje typy w wielu sytuacjach — czasem w sposób nieintuicyjny.
6.1 Konwersja jawna (ręczna)
6.2 Konwersja niejawna (automatyczna)
Zalecenie: zawsze stosuj jawne konwersje, aby uniknąć błędów.
7. Porównania typów
W JavaScript istnieją dwa operatory porównania:
| Operator | Opis | Przykład |
|---|---|---|
== |
porównuje wartości z konwersją typu | "5" == 5 → true |
=== |
porównuje wartości i typy | "5" === 5 → false |
Zawsze zaleca się używać operatora ścisłego porównania (===), aby uniknąć błędnych konwersji typów.
8. Przykładowe pułapki typów
Dlatego znajomość konwersji i typów danych w JS jest kluczowa dla poprawnego działania aplikacji.
9. Podsumowanie
| Typ danych | Przykład | typeof wynik |
|---|---|---|
| String | "tekst" |
"string" |
| Number | 42 |
"number" |
| Boolean | true |
"boolean" |
| Undefined | undefined |
"undefined" |
| Null | null |
"object" |
| Symbol | Symbol("id") |
"symbol" |
| BigInt | 123n |
"bigint" |
| Object | {} |
"object" |
| Array | [] |
"object" |
| Function | function(){} |
"function" |
10. Najważniejsze wnioski
- JavaScript ma 7 typów prymitywnych i 1 typ złożony (object), który stanowi bazę dla wszystkich struktur danych.
- Typy są określane dynamicznie, a zmienne mogą zmieniać swój typ w trakcie działania programu.
- Operator
typeofpozwala szybko sprawdzić typ, ale trzeba uważać na wyjątki (typeof null === "object"). - Zawsze używaj ścisłego porównania (
===), aby uniknąć błędów konwersji. - Zrozumienie różnic między typami prymitywnymi i referencyjnymi jest kluczowe dla poprawnego zarządzania danymi i pamięcią.
Podsumowując: Typy danych w JavaScript stanowią fundament języka. Ich znajomość pozwala pisać czystszy, bardziej przewidywalny i bezpieczny kod, unikać błędów konwersji oraz w pełni wykorzystać możliwości dynamicznej natury JavaScriptu.