Rozdíl mezi null a undefined v JavaScriptu
Před pár dny mi dorazil mail od Jakuba
Vrány, ve kterém se mě ptal, jestli nevím, proč má JavaScript kromě hodnoty
null
ještě undefined
. Protože si myslím, že má odpověď
by mohla zajímat více lidí, rozhodl jsem se ji spolu s původním dotazem
zveřejnit a budu rád, pokud ji případně v komentářích doplníte.
Dotaz
Tušíš, proč je v JavaScriptu jak hodnotanull
, takundefined
? Podle mě by se všude na místěnull
dalo používatundefined
. Má nějaký smysl mít dvě speciální hodnoty?
Odpověď
Nějaký "oficiální" důvod jsem nikde nenašel. Ve specifikaci je sice popsáno chování, ale zdůvodnění existence chybí.
Osobně se domnívám, že jde hlavně o sémantický rozdíl.
Hodnotu undefined
vrací konstrukce jazyka, když chtějí říct
"nevím":
- Jaká je hodnota
nedefinovanénepřiřazené proměnné? Nevím. - Jaká je hodnota nedefinované vlastnosti objektu? Nevím.
- Jaká je hodnota nepředaného parametru funkce? Nevím.
- Jaká je návratová hodnota funkce bez explicitního
return
? Nevím. - atd. (obdobných situací je ještě několik)
V podstatě jsou to situace, kdy by jiné jazyky vrátily chybu. Kdyby
se všechny situace, kdy se vrací undefined
, nahradily vyvoláním
chyby, JavaScript by dál fungoval a byl konzistentní, jen by byl o něco
striktnější.
Hodnota undefined
je tedy taková spíš systémová záležitost;
prostředek, jak jazyk učinit volnější. Nemyslím, že by programátor měl vůbec kdy
napsat výraz, který by undefined
vracel.
Hodnota null
je naopak hodnota, u které se využití uživatelem
očekává – jazyk sám ji používá minimálně. Slouží především k tomu, aby
uživatel měl jak vyjádřit "nezadáno".
Otázkou je, zda oddělení null
a undefined
nepřináší
víc problémů než užitku. Pokud by se tyto hodnoty sloučily a všude, kde se dnes
vrací undefined
, by se vracelo null
, mělo by za
důsledek neodlišitelnost některých situací:
- Je proměnná
nedefinovanánepřiřazená nebo je nastavena nanull
? - Je vlastnost objektu nedefinovaná nebo je nastavena na
null
? - Nebyl parametr funkce předán nebo byl nastaven na
null
? - Nevrátila funkce žádnou hodnotu nebo vrátila
null
? - atd.
Na první pohled se zdá, že to jsou docela vážné problémy, ale zkušenost z
jiných jazyků ukazuje, že zdaleka tak vážné nejsou. Například v jazyce Ruby mají
nedefinované instanční proměnné hodnotu nil
(ekvivalent
null
) a tuto hodnotu vrací také neúspěšný přístup k položce v hash
tabulce nebo přístup k položce pole, co je out-of-range. Podobně vrací
nil
metoda bez explicitního return
. Nezdá se, že by
toto někomu vadilo (lidi na Ruby kritizují hodně věcí, ale tohle ne).
Toť asi vše, co jsem k tomuto tématu schopen říct.