Datové typy jsou důležité, protože jazyk potřebuje znát druh dat, s nimiž pracuje, aby mohl provádět správné operace a výpočty. Například pokud sčítáte pomocí operátoru plus dvě proměnné, JS podle datového typu provede správnou operaci. Pokud jsou jejich typem dvě čísla, pak sečte hodnoty, pokud jde o řetězce pak je spojí v jeden atd.
O Javascript se často píše, že je dynamicky typovaný, což znamená, že při deklaraci proměnné neuvádíte jeho jeho datový typ. To neznamená, že v JS nejsou různé datové typy. Všechny programovací jazyky mají nějakou sadu základních datových typů.
JS má 7 primitivních datových typů, kterými jsou string
, number
, boolean
a dva typy pro prázdné hodnoty undefined
a null
.
Nový standard ECMA 6 přinesl nový primitivní typ symbol
a ve verzi ECMA2020 bigint
, který slouží k práci s celočíselnými hodnotami většími než 53 bitů.
Tyto primitiva jsou kousky dat, jejich hodnota je cela uložena na jednom pameťovém míste.
Ostatní typy pak nejsou "primitivní", ale jsou to složitější struktury, které se zpravidla skládají z těchto primitivních.
Objekty, pole nebo funkce, jejich hodnota je reference. Primitivní typy nemají žádné vlastnosti ani metody na rozdíl od objektů.
Operátor typeof
V JS je zabudovaný velice užitečný operátor typeof
.
Pomocí něj, můžeme zjistit jaký datový typ má daná hodnota či proměnná.
Dalo by se předpokládat, že typeof
bude vracet jeden ze sedmi primitivních typů a typ Object
.
Operátor však vrací různých 9 hodnot. Vypišme si je všechny:
// Primitivní datové typy
typeof "proVyvojare"; // string
typeof 1; // number
typeof true; // boolean
typeof Symbol(); // symbol
var x;
typeof x; // undefined
typeof null; // object (starý js bug)
typeof 42n; // bigint
// Objektové
typeof []; // object
typeof function () {}; // function
typeof {}; // object
typeof /regex/; // object
Možná jste si všimli, že v seznamu typů přebývá function
. Funkce není primitivním datovým typem, ale jde ve skutečnosti o objekt.
ECMAScript 5 byla zavedena metoda Array.isArray
pro kontrolu pole, protože typeof nedokáže rozlišit pole od objektů.
Kromě null
a undefined
mají všechny primitivní hodnoty objektové ekvivalenty (String
, Number
, BigInt
, Boolean
, Symbol
) které pracují s primitivnímy typy.
Typ number
V JS se nerozlišuje mezi celými a desetinnými čísly. Všechny čísla ukládá se jako desetinná čísla s plovoucí desetinnou čárkou s dvojitou přesností podle mezinárodního standardu IEEE 754.
Dle IEEE 754 jsou čísla reprezentována pomocí 64bitových čísel s celočíselnou hodnotou.
Neplatné číslo
Součást čísel je i hodnota NaN
, která je určená pro neplanou hodnotu čísla.
Kladné a záporné
Javascript má také záporné a kladné nekonečno.
Number.NEGATIVE_INFINITY //-Infinity
Number.POSITIVE_INFINITY //Infinity
A také narazíte na záporné a kladné nulové hodnoty.
Zaokrouhlovací chyba
V JavaScriptu můžena narazit na situaci, kdy součet 0.1 + 0.2 === 0.3
vrátí hodnotu false
. Sčítání se ve skutečnosti rovná 0,30000000000000004. Této situaci se říká efekt zaokrouhlovací chyby a dochází k ní u binárních čísel s plovoucí desetinnou čárkou, kterým někdy chybí přesnost.
ES6 zavádí konstantu Number.EPSILON, která se používá pro kontrolu, zda rozdíl mezi skutečným a očekávaným výsledkem spadá do tolerance zaokrouhlovací chyby 2,220446049250313e-16.
Typ string
Řetězce v javascriptu jsou charateristické tím, že jsou neměnné, tzv. imutabilní.
a = "hello";
a[2] = "Z";
a //"hello"
a.toUpperCase(); //"HELLO"
a //"hello"
Typ boolean
Kontrola logických hodnot je snadná - jsou buď true
, nebo false
a operátor typeof
vrátí hodnotu "boolean":
Prázdné hodnoty
Při práci s datovými typy si musíme dát pozor také na prázdné stavy undefined
(nedefinováno), null
a undeclared (nedeklarováno).
Nedeklarováný
Stav nedeklarováno (undeclared
) znamená, že se pokoušíme přistupovat k proměnné, která dosud nebyla deklarována pomocí klíčového slova var
, let
nebo const
. Nedeklarováno tedy znamená, že proměná nebyla nikdy vytvořena. Javascript v tomto případě skončí s vyhozenou chybovou vyjímkou.
// ReferenceError: vyvojar is not defined
console.log(vyvojar)
Null
Hodnota null
reprezentuje prázdný objekt. Vyskytuje se na místech, kde očekáváme objekt nebo funkci.
Nedefinovano
Stav undefined
^undef je poměrně běžný a vyjadřuje, že v paměti existuje požadovaná proměnná, ale v tuto chvíli nemá žádnou hodnotu.
var vyvojar;
console.log(vyvojar) // undefined
Null vs nedefinováno
Operátor dvojitého rovná se ==
nerozlišuje mezi null
a undefined
. Pokud z nějakého důvodu chcete ve svém kódu tyto dva typy rozlišovat, používejte striktní porovnání ===
.
null == undefined // true
null === undefined // false