Я бы использовал typeof foo === "undefined"
везде. Это никогда не может пойти не так.
Я предполагаю, что причина, по которой jQuery рекомендует два разных метода, заключается в том, что они определяют свою собственную undefined
переменную в функции, в которой находится код jQuery, поэтому внутри этой функции undefined
она защищена от вмешательства извне. Я также предположил бы, что кто-то где-то сравнил два разных подхода и обнаружил, что foo === undefined
это быстрее, и поэтому решил, что это путь. [ОБНОВЛЕНИЕ: как отмечено в комментариях, сравнение с undefined
также немного короче, что может быть соображением.] Однако, выигрыш в практических ситуациях будет крайне незначительным: эта проверка никогда не будет узким местом, и что Вы теряете значение: оценка свойства хост-объекта для сравнения может вызвать ошибку, тогда какtypeof
проверять никогда не буду.
Например, следующее используется в IE для анализа 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
чек.