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:

  1. Typy prymitywne (Primitive types)
  2. 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:

  1. string
  2. number
  3. boolean
  4. undefined
  5. null
  6. symbol
  7. bigint

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

  • -Infinity
  • NaN (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 (return bez 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:

  1. Object
  2. Array
  3. Function
  4. 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 typeof pozwala 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.