Я бы использовал 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
UPDATE
Еще одно преимущество проверки typeof
, о которой я забыл упомянуть, заключалось в том, что она также работает с необъявленными переменными, чего нет у проверки foo === undefined
, и фактически выдает ReferenceError
.Спасибо @LinusKleen за напоминание.Например:
typeof someUndeclaredVariable; // "undefined"
someUndeclaredVariable === undefined; // throws a ReferenceError
Итог: всегда используйте проверку typeof
.