JavaScript nám umožňuje pracovat s primitivy (řetězci, čísly atd.), jako by to byly objekty. Poskytují také metody pro volání jako takové. Brzy je prostudujeme, ale nejprve uvidíme, jak to funguje, protože primitiva samozřejmě nejsou objekty (a zde to ještě objasníme).
Podívejme se na hlavní rozdíly mezi primitivy a objekty.
Primitivní
- Je to hodnota primitivního typu.
- Existuje 7 primitivních typů:
string
,number
,bigint
,boolean
,symbol
,null
aundefined
.
Objekt
- Je schopen uložit více hodnot jako vlastnosti.
- Lze vytvořit pomocí
{}
, například:{name: "John", age: 30}
. V JavaScriptu existují další druhy objektů:například funkce jsou objekty.
Jedna z nejlepších věcí na objektech je, že můžeme uložit funkci jako jednu z jejích vlastností.
let john = {
name: "John",
sayHi: function() {
alert("Hi buddy!");
}
};
john.sayHi(); // Hi buddy!
Zde jsme tedy vytvořili objekt john
pomocí metody sayHi
.
Mnoho vestavěných objektů již existuje, například ty, které pracují s daty, chybami, prvky HTML atd. Mají různé vlastnosti a metody.
Tyto funkce však něco stojí!
Předměty jsou „těžší“ než primitiva. Vyžadují další zdroje na podporu interního aparátu.
Primitiv jako objekt
Zde je paradox, kterému čelí tvůrce JavaScriptu:
- Je mnoho věcí, které by člověk chtěl dělat s primitivem, jako je řetězec nebo číslo. Bylo by skvělé k nim přistupovat pomocí metod.
- Primitiva musí být co nejrychlejší a nejlehčí.
Řešení vypadá trochu nešikovně, ale tady je:
- Primitiva jsou stále primitivní. Jediná hodnota podle potřeby.
- Jazyk umožňuje přístup k metodám a vlastnostem řetězců, čísel, booleanů a symbolů.
- Aby to fungovalo, je vytvořen speciální „objektový obal“, který poskytuje další funkce, a poté je zničen.
„Objektové obaly“ se pro každý primitivní typ liší a nazývají se:String
, Number
, Boolean
, Symbol
a BigInt
. Poskytují tedy různé sady metod.
Například existuje řetězcová metoda str.toUpperCase(), která vrací velké str
.
Funguje to takto:
let str = "Hello";
alert( str.toUpperCase() ); // HELLO
Jednoduché, že? Zde je to, co se ve skutečnosti děje v str.toUpperCase()
:
- Řetězec
str
je primitiv. Takže v okamžiku přístupu k jeho vlastnosti se vytvoří speciální objekt, který zná hodnotu řetězce a má užitečné metody, jako jetoUpperCase()
. - Tato metoda se spustí a vrátí nový řetězec (zobrazený jako
alert
). - Speciální objekt je zničen a zůstane primitivní
str
sám.
Primitiva tedy mohou poskytovat metody, ale stále zůstávají lehké.
JavaScript engine vysoce optimalizuje tento proces. Může dokonce přeskočit vytvoření dalšího objektu vůbec. Musí však stále dodržovat specifikaci a chovat se, jako by ji vytvořil.
Číslo má své vlastní metody, například toFixed(n) zaokrouhlí číslo na danou přesnost:
let n = 1.23456;
alert( n.toFixed(2) ); // 1.23
Konkrétnější metody uvidíme v kapitolách Čísla a Řetězce.
KonstruktoryString/Number/Boolean
jsou pouze pro vnitřní použití
Některé jazyky jako Java nám umožňují explicitně vytvářet „obalové objekty“ pro primitiva pomocí syntaxe jako new Number(1)
nebo new Boolean(false)
.
V JavaScriptu je to také možné z historických důvodů, ale vysoce nedoporučované . Věci se zblázní na několika místech.
Například:
alert( typeof 0 ); // "number"
alert( typeof new Number(0) ); // "object"!
Objekty jsou vždy pravdivé v if
, takže zde se upozornění zobrazí:
let zero = new Number(0);
if (zero) { // zero is true, because it's an object
alert( "zero is truthy!?!" );
}
Na druhou stranu pomocí stejných funkcí String/Number/Boolean
bez new
je naprosto v pořádku a užitečná věc. Převádějí hodnotu na odpovídající typ:na řetězec, číslo nebo booleovský (primitivní).
Například toto je zcela platné:
let num = Number("123"); // convert a string to number
null/undefined nemají žádné metody
Speciální primitiva null
a undefined
jsou výjimky. Nemají žádné odpovídající „obalové objekty“ a neposkytují žádné metody. V jistém smyslu jsou „nejprimitivnější“.
Pokus o přístup k vlastnosti takové hodnoty by způsobil chybu:
alert(null.test); // error
Shrnutí
- Primitivní prvky kromě
null
aundefined
poskytnout mnoho užitečných metod. Budeme je studovat v nadcházejících kapitolách. - Formálně tyto metody fungují prostřednictvím dočasných objektů, ale JavaScriptové enginy jsou dobře vyladěny, aby to optimalizovaly interně, takže jejich volání není drahé.