W języku JavaScript zdefiniowano następujących sześć typów wbudowanych:
typeof
Operator ten sprawdza typ danej wartości i zawsze zwraca wartość łańcuchową.
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
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