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);