V moderních prohlížečích, jako je Chrome, Firefox či Edge skutečně není hodnota proměnné undefined definována.
undefined = 1; //vrátí 1 (ale nezmění!) typeof undefined; //vrátí "undefined"
To je proto, že undefined již není globální proměnná (tedy window.undefined), ale jde o speciální konstrukci (podobně jako třeba return; nebo continue;). Dokonce i hodnota window.undefined je vždy nedefinována, i když do ní něco přiřadíte.
Ale ve starších verzích prohlížečů bylo možno změnit hodnotu proměnné undefined nebo window.undefined:
undefined = 1; //vrátí 1 typeof undefined; //vrátí "number" (tedy je 1)
Jak tedy zajistit – pokud nevíte, v jakém prostředí skript poběží – že dostanete skutečně nedefinovanou hodnotu?
Prázdná funkce
Hodnotu undefined vždy vrátí klíčové slovo return bez parametru. Stejně se samozřejmě chová i funkce, která skončí bez použití klíčového slova return. Což v důsledku znamená, že prázdná funkce vždy vrátí undefined:
function undef() {}; //prázdná funkce
typeof undef(); //vrátí "undefined"
var undef = function(undef) {
if (undef) {
return; /vrátí undefined
}
}
undef(); //vrátí undefined na konci funkce
undef(true); //vrátí undefined z return
Hodnotu undefined tedy můžete získat pomocí self-invoking (funkce, která se sama spustí) prázdné funkce:
typeof (function(){})(); //vrátí "undefined"
To je ale přeci jenom trochu hodně závorek na získání undefined hodnoty.
Proměnná ve funkci
Pokud potřebujete undefined uvnitř funkce, je situace o dost jednodušší, protože stačí nadefinovat lokální proměnnou, do které nepřiřadíte hodnotu:
var undef = function() {
var undef;
return typeof undef;
}
undef(); //vrátí "undefined"
Podobně se často používá parametr undefined, který se pak funkci nepředá a proto je nedefinovaný:
(function(window, $, undefined) {
//...
})(window, jQuery);
//funkci se předají jen 2 parametry
//i když čeká 3 - proto bude třetí undefined
Prázdnota
V Javascriptu existuje jedna málo známá konstrukce, která vždy vrátí undefined hodnotu:
var prazdno = void 0; //vrátí undefined typeof prazdno; //vrátí "undefined"
Za klíčové slovo void můžete zadat libovolnou hodnotu nebo zavolat libovolnou funkci a návratová hodnota bude vždy undefined. Stejně jako u return můžete hodnotu oddělit buď mezerou, nebo ji uzavřít do závorek.
//všechno vrácí undefined
prazdno = void Math.round(0.5);
prazdno = void("něco");
prazdno = void true;
Většinou se ale používá jako parametr nula, protože u ní je na první pohled vidět, že se od ní nic nečeká a je to kratší, než např. uvádět undefined:
var prazdno = void undefined; //vrátí undefined
Klíčové slovo void se často používá v odkazech, u kterých nechcete, aby někam odkazovaly, ale zároveň potřebujete, aby měli atribut href a prohlížeč je tedy správně označil jako odkaz:
<a href="javascript:void(0)">
Klíčové slovo void můžete použít i v podmínkách, pokud chcete změnit chování, protože konstrukce void má nejvyšší prioritu:
function Person(clone) {
if (clone || $this->birth()) {
//práce s osobou
}
}
function Person(clone) {
if (void clone || $this->birth()) {
//práce s osobou
}
}
V prvním případě lze pomocí new Person(true) vytvořit osobu bez zavolání její funkce birth(). V druhém případě je pomocí void zakázáno klonování a tak dojde k zavolání metody birth() i při volání new Person(true).
Toho lze využít buď při debugování, kdy chcete dočasně vypnout část podmínky, nebo v případě, kdy chcete uvnitř podmínky zavolat funkci, ale ignorovat její výsledek:
var arr = [-1,0,1,2]
//chceme z pole vymazat záporné hodnoty
//a ověřit zda stále obsahuje alespoň 4 čísla
//podmínka je True (vrátí smazanou -1)
(0 < arr[0] || arr.shift() || 4 <= arr.length);
//podmínka je False
(0 < arr[0] || void arr.shift()
|| 4 <= arr.length);