JavaScript nám umožÅuje pracovat s primitivy (ÅetÄzci, ÄÃsly atd.), jako by to byly objekty. Poskytuje i metody, které na nich můžeme volat jako na objektech. V dalÅ¡Ãch kapitolách je prostudujeme, ale nejprve se podÃváme, jak to funguje, protože primitivy samozÅejmÄ nejsou objekty (a zde to jeÅ¡tÄ vÃce ozÅejmÃme).
PodÃváme se na klÃÄové rozdÃly mezi primitivy a objekty.
Primitiv:
- PÅedstavuje hodnotu primitivnÃho typu.
- Existuje 7 primitivnÃch typů:
string,number,bigint,boolean,symbol,nullaundefined.
Objekt:
- Dokáže obsahovat vÃce hodnot uložených ve svých vlastnostech.
- Může být vytvoÅen pomocÃ
{}, napÅ.{jméno: "Jan", vÄk: 30}. V JavaScriptu jsou i jiné druhy objektů, napÅÃklad funkce jsou objekty.
Jedna z nejlepÅ¡Ãch vÄcà na objektech je, že jako jejich vlastnost můžeme uložit funkci.
let jan = {
jméno: "Jan",
ÅekniAhoj: function() {
alert("Ahoj kámo!");
}
};
jan.ÅekniAhoj(); // Ahoj kámo!
Zde jsme tedy vytvoÅili objekt jan s metodou ÅekniAhoj.
JavaScript obsahuje mnoho vestavÄných objektů, napÅÃklad ty, které pracujà s daty, chybami, HTML prvky a podobnÄ. Majà různé vlastnosti a metody.
Tyto vlastnosti však majà svou cenu!
Objekty jsou âtÄžšÃâ než primitivy. Vyžadujà vÃce zdrojů, které zatÄžujà vnitÅnà stroj.
Primitiv jako objekt
Tvůrci JavaScriptu Äelili následujÃcÃmu paradoxu:
- Existuje mnoho vÄcÃ, které ÄlovÄk chce dÄlat s primitivy, jakými jsou ÅetÄzec nebo ÄÃslo. Bylo by skvÄlé pÅistupovat k nim pomocà metod.
- Primitivy musejà být co nejrychlejšà a co nejmenÅ¡Ã.
ÅeÅ¡enà vypadá trochu tÄžkopádnÄ, ale je zde:
- Primitiv je poÅád primitiv. Jednoduchá hodnota, po jaké toužÃme.
- Jazyk umožÅuje pÅÃstup k metodám a vlastnostem ÅetÄzců, ÄÃsel, booleanů a symbolů.
- Aby to fungovalo, vytvoÅà se speciálnà objekt zvaný âobalâ neboli âwrapperâ, který tuto pÅÃdavnou funkcionalitu poskytne a pak bude zniÄen.
Tyto âobjektové obalyâ jsou pro každý primitivnà typ jiné a nazývajà se: String, Number, Boolean, Symbol a BigInt. Poskytujà tedy různé sady metod.
NapÅÃklad existuje ÅetÄzcová metoda ÅetÄzec.toUpperCase(), která vracà ÅetÄzec zapsaný velkými pÃsmeny.
Funguje následovnÄ:
let ÅetÄzec = "Ahoj";
alert( ÅetÄzec.toUpperCase() ); // AHOJ
Jednoduché, že? Ve skuteÄnosti se v ÅetÄzec.toUpperCase() dÄje následujÃcÃ:
- ÅetÄzec
ÅetÄzecje primitiv. V okamžiku pÅÃstupu k jeho vlastnosti se tedy vytvoÅà speciálnà objekt, který zná hodnotu tohoto ÅetÄzce a obsahuje užiteÄné metody, napÅ.toUpperCase(). - Tato metoda se spustà a vrátà nový ÅetÄzec (který je zobrazen funkcÃ
alert). - Speciálnà objekt se zniÄà a zůstane samotný primitiv
ÅetÄzec.
Primitivy tedy mohou poskytovat metody, ale samy zůstávajà malé.
JavaScriptový motor tento proces znaÄnÄ optimalizuje. Může dokonce úplnÄ vynechat vytvoÅenà nového objektu. Stále vÅ¡ak musà dodržovat specifikaci a chovat se tak, jako by jej vytvoÅil.
I ÄÃsla majà své vlastnà metody, napÅÃklad toFixed(n) zaokrouhluje ÄÃslo se zadanou pÅesnostÃ:
let n = 1.23456;
alert( n.toFixed(2) ); // 1.23
Dalšà specifické metody uvidÃme v kapitolách ÄÃsla a ÅetÄzce.
String/Number/Boolean jsou jen pro internà použitÃNÄkteré jazyky, napÅ. Java, nám umožÅujà explicitnÄ vytváÅet âobalyâ pro primitivy pomocà syntaxe typu new Number(1) nebo new Boolean(false).
V JavaScriptu je to z historických důvodů také možné, ale důraznÄ nedoporuÄované. Skript se zaÄne chovat bláznivÄ hned na nÄkolika mÃstech.
NapÅÃklad:
alert( typeof 0 ); // "number"
alert( typeof new Number(0) ); // "object"!
Objekty jsou v if vždy pravdivé, takže zde se zobrazà hlášenÃ:
let nula = new Number(0);
if (nula) { // nula je pravdivá, protože je to objekt
alert( "nula je pravdivá!?!" );
}
Naproti tomu použità stejné funkce String/Number/Boolean bez new je zcela správná a užiteÄná vÄc. Funkce pÅevede hodnotu na odpovÃdajÃcà typ: na ÅetÄzec, na ÄÃslo nebo na boolean (na primitiv).
NapÅÃklad tohle je zcela v poÅádku:
let ÄÃslo = Number("123"); // pÅevede ÅetÄzec na ÄÃslo
Speciálnà primitivy null a undefined pÅedstavujà výjimky. Nemajà odpovÃdajÃcà âobalyâ a neposkytujà žádné metody. V urÄitém smyslu slova jsou vlastnÄ âty nejprimitivnÄjÅ¡Ãâ.
Pokus o pÅÃstup k vlastnosti takové hodnoty ohlásà chybu:
alert(null.test); // chyba
ShrnutÃ
- Primitivy s výjimkou
nullaundefinedposkytujà mnoho užiteÄných metod. Prostudujeme je v následujÃcÃch kapitolách. - FormálnÄ tyto metody pracujà na doÄasných objektech, ale JavaScriptové motory jsou dobÅe vyladÄny, aby je vnitÅnÄ optimalizovaly, takže jejich volánà nenà nákladné.
KomentáÅe
<code>, pro nÄkolik Åádků je obalte znaÄkou<pre>, pro vÃce než 10 Åádků vložte odkaz na pÃskoviÅ¡tÄ (plnkr, jsbin, codepenâ¦)