<<< PŘEDCHOZÍ           DALŠÍ >>>


Konverze typů

V části pojednávající o deklaraci proměnných jsem velmi vyhýbavě odpověděla na otázku, zda má proměnná svůj datový typ. Právě teď přišla ta správná chvíle vám říct celou pravdu.

JavaScript nemá explicitní datové typy. Není zde možnost určit, zda určitá proměnná představuje číslo, řetězec nebo logickou hodnotu. Jakákoliv proměnná může být jakýmkoliv typem. Proto je v JavaScriptu možné jedné proměnné přiřadit v deklaraci jeden datový typ a někde později v kódu jiný datový typ. Například:

var x = 5 // x má implicitní datový typ číslo

x = "ahoj" // x má implicitní datový typ řetězec

Většina programovacích jazyků má explicitní datové typy a proto by u nich předchozí pokus skončil chybovým hlášením. V Pascalu, který má explicitní datové typy, je nutné přímo v deklaraci proměnné uvést závazně její datový typ. Proměnné lze pak přiřazovat pouze hodnoty tohoto datového typu. JavaScript má implicitní datové typy a tak nejenže nevrátí žádné chybové hlášení, ale oba příkazy provede. Tím se změní implicitní datový typ x z čísla na řetězec. Pamatujte si, že měnit implicitní typ dat je zpravidla špatné rozhodnutí i když, jak vidíte, možné.

Ale tohle ještě není celá pravda. Její zbytek se skrývá ve skutečnosti, že může být jedna proměnná v různých kontextech interpretována různě. Programovací jazyky s explicitními datovými typy tento problém nemají. Operátory mohou spojovat jen operandy stejného datového typu. Pokud mají operandy různý typ, je vráceno chybové hlášení. JavaScript oproti těmto jazykům zpracuje téměř všechno. Jestliže operátory spojují operandy stejného implicitního datového typu, které lze operátorem spojit (např. násobit dva řetězce je obecně nesmysl), vrací očekávaný výsledek a proměnná je implementovaná očekávaným způsobem. Když tomu tak není, JavaScript se pokouší hodnoty proměnných konvertovat (převést) v závislosti na kontextu tak, aby operátor spojoval hodnoty stejného typu a toto spojení bylo smysluplné. Až potom je vykonána operace. Výsledek má stejný datový typ jako obě hodnoty.

Příklad:

var x = 5 // x má implicitní datový typ číslo

var y = "12" // y má implicitní datový typ řetězec

var z = "2" // z má implicitní datový typ řetězec

var s = "ahoj" // s má implicitní datový typ řetězec

var b = true // b má implicitní datový typ logická hodnota

var pom = null // pom nemá žádný implicitní datový typ

// null se konvertuje dle pravidel uvedených výše

var v // v nemá žádný implicitní datový typ

/* jakým způsobem budou chápány hodnoty proměnných , hodnota v včetně typu */

v = x + y // v = "5" + "12" "512" řetězec (string)

v = y + x // v = "12" + "5" "125" řetězec (string)

v = x * y // v = 5 * 12 60 číslo (number)

v = y * z // v = 12 * 2 24 číslo (number)

// násobení řetězců není definováno

v = x * s // pokus převést "ahoj" na číslo je neúspěšný

// vrátí proto NaN, bez ohledu na x bude v

// NaN číslo (number)

v = z + pom // v = "2" + "null" "2null" řetězec (string)

v = b + true // v = 1 + 1 2 číslo (number)

v = pom + false // v = 0 + 0 0 číslo (number)

v = !pom // v = !false true logická hodnota (boolean)

v = !(-15) // v = !true false logická hodnota (boolean)

I přesto, že jsou hodnoty proměnných dle kontextu chápány různě, jejich implicitní datový typ je stále stejný. Pouze implicitní datový typ v je stále měněn podle datového typu výsledku. Chcete-li se o tom přesvědčit, vytvořte si skript, který bude obsahovat příkazy tohoto příkladu a vložte do něj na požadovaná místa příkaz alert(typeof název_proměnné) zobrazující datový typ proměnné.

Právě tato vlastnost JavaScriptu je zdrojem mnoha špatně odhalitelných chyb i když někdy může být i přínosem. Snažte se proto s operátory spojovat proměnné stejných typů, které jím spojovat jdou. Pokud to tak neuděláte, bude datový typ hodnoty proměnné konvertován podle kontextu. Při této konverzi používá JavaScript několik pravidel. Předchozí příklad vám některá ukázal v konkrétních případech. V následující tabulce je souhrn zobecněných pravidel. Nejedná se o jejich úplný výčet, ale pokusila jsem se zformulovat jen ty nejdůležitější, s jejichž výsledky se budete pravděpodobně setkávat nejčastěji.
 
Operátor/Obvyklý typ operandů
Pravidlo konverze
+

číslo, řetězec

číslo, řetězec – číslo se konvertuje na řetězec

boolean, boolean – konverze na čísla (false=0, true=1)

řetězec, boolean – boolean na řetězec

číslo, boolean – boolean na číslo

-, *, /, %, ++, --

číslo

Jakékoliv operandy použité v tomto kontextu se bude JavaScript pokoušet konvertovat na číslo. Pokud se mu to nepovede výsledek operace bude NaN. V některých případech podá JavaScript chybové hlášení. 

Konverze řetězce na číslo může být úspěšná pokud řetězec obsahuje pouze číslo a nebo je prázdný. 

&&, ||, !

logická hodnota

Jakékoliv operandy použité v tomto kontextu se bude JavaScript pokoušet konvertovat na logickou hodnotu (boolean). 

řetězec – jakýkoliv neprázdný řetězec na true, prázdný řetězec na false

číslo – jakékoliv nenulové číslo na true, nulu nebo NaN na false


<<< PŘEDCHOZÍ           DALŠÍ >>>