Metody primitiv

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 a undefined .

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:

  1. Primitiva jsou stále primitivní. Jediná hodnota podle potřeby.
  2. Jazyk umožňuje přístup k metodám a vlastnostem řetězců, čísel, booleanů a symbolů.
  3. 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() :

  1. Ř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 je toUpperCase() .
  2. Tato metoda se spustí a vrátí nový řetězec (zobrazený jako alert ).
  3. 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.

Konstruktory String/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 a undefined 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é.