Chciałbym używać typeof foo === "undefined"
wszędzie. To nigdy nie może pójść źle.
Wyobrażam sobie, że powodem, dla którego jQuery zaleca dwie różne metody, jest to, że definiują one swoją własną undefined
zmienną w funkcji, w której żyje kod jQuery, więc wewnątrz tej funkcji undefined
można bezpiecznie manipulować z zewnątrz. Wyobrażam sobie również, że ktoś gdzieś porównał dwa różne podejścia i odkrył, że foo === undefined
jest to szybsze, i dlatego postanowił, że tak należy. [AKTUALIZACJA: jak zauważono w komentarzach, porównanie z undefined
jest również nieco krótsze, co może być rozważeniem.] Jednak zysk w praktycznych sytuacjach będzie zupełnie nieistotny: ta kontrola nigdy nie będzie nigdy żadnym wąskim gardłem i co utrata jest znacząca: ocena właściwości obiektu hosta do porównania może spowodować błąd, podczas gdy atypeof
sprawdź nigdy nie będzie.
Na przykład w IE do analizowania XML używane są:
var x = new ActiveXObject("Microsoft.XMLDOM");
Aby sprawdzić, czy loadXML
metoda ma bezpiecznie:
typeof x.loadXML === "undefined"; // Returns false
Z drugiej strony:
x.loadXML === undefined; // Throws an error
AKTUALIZACJA
Kolejną zaletą typeof
czeku, o którym zapomniałem wspomnieć, jest to, że działa on również z niezadeklarowanymi zmiennymi, czego foo === undefined
nie sprawdza i faktycznie rzuca ReferenceError
. Dzięki @LinusKleen za przypomnienie. Na przykład:
typeof someUndeclaredVariable; // "undefined"
someUndeclaredVariable === undefined; // throws a ReferenceError
Konkluzja: zawsze używaj typeof
czeku.