Primitivní datové typy

AndreaAndrea

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