Je undefined skutečně „undefined“?

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

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..