JavaScript - typy danych

typy wbudowane

W języku JavaScript zdefiniowano następujących sześć typów wbudowanych:

  • null
  • undefined
  • boolean
  • number
  • string
  • object
Sprawdzenie typu danych odbywa się z zastosowaniem konstrukcji zawierającej typeof Operator ten sprawdza typ danej wartości i zawsze zwraca wartość łańcuchową.

typeof undefined === "undefined"; // true
typeof true === "boolean"; // true
typeof 42 === "number"; // true
typeof "42" === "string"; // true
typeof { life: 42 } === "object"; // true

Jak być może zauważyłeś, powyższy listing nie uwzględnia typu null. Jest to typ specjalny w tym sensie, że w połączeniu z operatorem typeof powoduje błędne działanie:

typeof null === "object"; // true

Byłoby poprawnie, gdyby w tym przypadku został zwrócony wynik "null", ale ten istniejący od początku w języku JavaScript błąd przetrwał przez niemal dwie dekady.
Prawdopodobnie nigdy nie zostanie usunięty, ponieważ istnieje tak duża liczba danych internetowych, które bazują na takim błędnym działaniu, że "naprawienie" błędu spowodowałoby wystąpienie większej liczby "błędów" i awarię większości oprogramowania internetowego.

Aby sprawdzić wartość używającą swojego typu pod kątem typu null, musisz skorzystać z warunku złożonego: var a = null;
(!a && typeof a === "object"); // true

typy zmiennych

W języku JavaScript zmienne są pozbawione typów — to wartości mają typy.
W dowolnym momencie zmienne mogą przechowywać dowolną wartość.
Oznacza to, że typ zmiennej można w dowolnym momencie zmienić.
W ramach jednej instrukcji przypisania zmienna może przechowywać typ string, w następnej instrukcji może zawierać typ number itd.

Wartość 42 jest macierzystego typu number. Typ ten nie może zostać zmieniony. Inna wartość, taka jak "42" typu string, może zostać utworzona na bazie wartości 42 typu number z wykorzystaniem procesu nazywanego konwersją typów (ang. coercion). Użycie operatora typeof dla zmiennej nie oznacza wbrew temu, co może się wydawać, zadania pytania: "Jaki jest typ zmiennej?".
Wynika to stąd, że zmienne w języku JavaScript nie mają typów. Formułowane jest natomiast następujące pytanie: "Jaki jest typ wartości w zmiennej?".


var a = 42;
typeof a; // "number"
a = true;
typeof a; // "boolean"
operator typeof zawsze zwraca łańcuch. A zatem:
typeof typeof 42; // "string"
			
W pierwszym przypadku (typeof 42) operator typeof zwraca "number", a w drugim (typeof "number") zwraca "string".

Zmienne, które w danym momencie nie mają żadnej wartości, w rzeczywistości zawierają wartość typu undefined.
Wywołanie operatora typeof dla takich zmiennych spowoduje zwrócenie "undefined":

var a;
typeof a; // "undefined"
var b = 42;
var c;
// w dalszej części kodu
b = c;
typeof b; // "undefined"
typeof c; // "undefined"

Dla większości projektantów kuszące może być potraktowanie słowa "undefined" (niezdefiniowane) jako synonimu słowa "undeclared" (niezadeklarowane). W języku JavaScript te dwa pojęcia są jednak całkiem odmienne.
Zmienna "niezdefiniowana" to zmienna, która została zadeklarowana w dostępnym zasięgu, ale w danym momencie nie przechowuje żadnej wartości.
Z kolei zmienna "niezadeklarowana" to zmienna, która formalnie nie została zadeklarowana w dostępnym zasięgu.

Przeanalizuj następujący kod:

var a;
a; // undefined
b; // błąd ReferenceError: zmienna b nie została zdefiniowana

Projekt i wykonanie: Ryszard Rogacz© 1999−2024