Automatická konverze datových typů v JavaScriptu
K tomuto příspěvku mě vede jeden rozhovor, kdy jsem radil kolegovi
ohledně určité konstrukce v JavaScriptu. Přesně už si samozřejmě
nevzpomínám, ale kód byl podobný následujícímu
function acme(id){
foo = document.getElementById(id);
if(!foo){
.
.
}
.
.
}V podstatě se jednalo o vyhodnocení foo v případě, že volání metody
getElementById(id) vrátí null. Ve výše uvedeném případě
se hodnota null vyhodnotí jako false.
Kolegovi jsem tedy řekl, že v případě, že element s daným id nebude prostě se provede kód
v if konstrukci. Bohužel jsem jaksi nedokázal dostatečně kvalifikovaně odpovědět na to proč
se null přetypuje na false.
Vysvětlení tohoto chování musíme začít u netypovosti či dynamické typovosti JavaScriptu.
V JavaScriptu nemusíme předem určovat jakého datového typu bude proměnná. Datový typ
přichází na řadu teprve v kontextu provádění, kde je proměnná přetypována na požadovaný typ.
V našem případě se vyhodnocuje logická hodnota proto se dynamicky null přetypuje
na false.
Automatickou konverzi datových typů, popisuje následující tabulka
(David Flanagen: JavaScript The Definitive Guide, Fourth Edition ISBN 80–7226–626–8),
podle které se provádí přetypování z jednoho typu na druhý.
| Hodnota | Řetězec | Číslo | Logická hodnota | Objekt |
|---|---|---|---|---|
| nedefinovaná hodnota | "undefined" | NaN | false | chyba |
null | "null" | 0 | false | chyba |
| neprázdný řetězec | beze změny | číselná hodnota řetězce nebo NaN | true | objekt String |
| prázdný řetězec | beze změny | 0 | false | objekt String |
0 | "0" | beze změny | false | objekt Number |
NaN | "NaN" | beze změny | false | objekt Number |
| nekonečno | "Infinity" | beze změny | true | objekt Number |
| záporné nekonečno | "- Infinity" | beze změny | true | objekt Number |
| jakékoliv jiné číslo | řetězcová hodnota čísla | beze změny | true | objekt Number |
true | "true" | 1 | beze změny | objekt Boolean |
false | "false" | 0 | beze změny | objekt Boolean |
| objekt | výsledek volání metody toString() | výsledek volání metody valueOf nebo toString() nebo hodnotu NaN | true | beze změny |
Související články
Související epizody CZ Podcastu
- #217 · Ivo Lukačovič
O Windy, JavaScriptu a budování firem.
- #3 · Java 6 SE, Vývoj webových aplikací
Dagi a Filemon o novinkách v Javě 6 a webových frameworcích.