Я б дотримувався використання typeof foo === "undefined"скрізь. Це ніколи не може піти не так.
Я уявляю, що причина, по якій jQuery рекомендує два різні методи, полягає в тому, що вони визначають свою власну undefinedзмінну в межах функції, в якій живе jQuery-код, тому всередині цієї функції undefinedзахищено від підробки ззовні. Я б також міг уявити, що хтось десь орієнтував два різні підходи і виявив, що foo === undefinedце швидше, і тому вирішив, що це шлях. [ОНОВЛЕННЯ: як зазначається в коментарях, порівняння з цим undefinedтакож трохи коротше, що може врахувати.] Однак виграш у практичних ситуаціях буде абсолютно незначним: ця перевірка ніколи не буде, ніколи не буде вузьким місцем, і що таке Ви втрачаєте важливо: оцінка властивості об'єкта хоста для порівняння може призвести до помилки, тоді як atypeof перевірити ніколи не буде.
Наприклад, для ISE для аналізу XML використовується наступне:
var x = new ActiveXObject("Microsoft.XMLDOM");
Щоб перевірити, чи є у нього loadXMLметод безпечно:
typeof x.loadXML === "undefined"; // Returns false
З іншої сторони:
x.loadXML === undefined; // Throws an error
ОНОВЛЕННЯ
Ще однією перевагою typeofперевірки, яку я забув згадати, було те, що вона також працює з незадекларованими змінними, чого foo === undefinedперевірка не робить, а насправді викидає a ReferenceError. Дякую @LinusKleen за те, що нагадав. Наприклад:
typeof someUndeclaredVariable; // "undefined"
someUndeclaredVariable === undefined; // throws a ReferenceError
Підсумок: завжди використовуйте typeofчек.