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ą undefinedzmienną w funkcji, w której żyje kod jQuery, więc wewnątrz tej funkcji undefinedmoż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 === undefinedjest to szybsze, i dlatego postanowił, że tak należy. [AKTUALIZACJA: jak zauważono w komentarzach, porównanie z undefinedjest 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 loadXMLmetoda ma bezpiecznie:
typeof x.loadXML === "undefined"; // Returns false
Z drugiej strony:
x.loadXML === undefined; // Throws an error
AKTUALIZACJA
Kolejną zaletą typeofczeku, o którym zapomniałem wspomnieć, jest to, że działa on również z niezadeklarowanymi zmiennymi, czego foo === undefinednie 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 typeofczeku.