В Рекомендации Jquery Основные Стиль предлагают два различных способа проверить, определена ли переменная.
- Глобальные переменные:
typeof variable === "undefined"
- Локальные переменные:
variable === undefined
- Свойства:
object.prop === undefined
Почему jQuery использует один подход для глобальных переменных, а другой - для локальных переменных и свойств?
javascript
jquery
undefined
Патрик МакЭлхани
источник
источник
foo === undefined
проверяет локальную копию undefined вместо глобальной (window.undefined), которая могла быть изменена с помощью безумного кода. Тот факт, что undefined является изменяемым, определенно стоит отметить, и я рад, что вы это сделали. (+1)Ответы:
Для необъявленных переменных
typeof foo
вернет строковый литерал"undefined"
, тогда как проверка идентичностиfoo === undefined
вызовет ошибку «foo не определен» .Для локальных переменных (которые, как вы знаете , где-то объявлены) такая ошибка не возникнет, следовательно, проверка идентичности.
источник
typeof foo; // -> "undefined"
), чтобы подчеркнуть, что это строка, а не примитивное значениеundefined
.Я бы использовал
typeof foo === "undefined"
везде. Это никогда не может пойти не так.Я предполагаю, что причина, по которой jQuery рекомендует два разных метода, заключается в том, что они определяют свою собственную
undefined
переменную в функции, в которой находится код jQuery, поэтому внутри этой функцииundefined
она защищена от вмешательства извне. Я также предположил бы, что кто-то где-то сравнил два разных подхода и обнаружил, чтоfoo === undefined
это быстрее, и поэтому решил, что это путь. [ОБНОВЛЕНИЕ: как отмечено в комментариях, сравнение сundefined
также немного короче, что может быть соображением.] Однако, выигрыш в практических ситуациях будет крайне незначительным: эта проверка никогда не будет узким местом, и что Вы теряете значение: оценка свойства хост-объекта для сравнения может вызвать ошибку, тогда какtypeof
проверять никогда не буду.Например, следующее используется в IE для анализа XML:
Чтобы проверить, есть ли у него
loadXML
метод безопасно:С другой стороны:
ОБНОВИТЬ
Еще одно преимущество
typeof
проверки, которую я забыл упомянуть, заключалось в том, что она также работает с необъявленными переменными, чего нет вfoo === undefined
проверке, и фактически выдает aReferenceError
. Спасибо @LinusKleen за напоминание. Например:Итог: всегда используйте
typeof
чек.источник
foo === undefined
при минимизации, вероятно, что-то вродеf===u
, тогда какtypeof foo === "undefined"
может быть уменьшено только доtypeof f==="undefined"
.var u = "undefined"
и уменьшить егоtypeof f==u
, что улучшает вещи, но все еще больше.typeof
необъявленных переменных является преимуществом. Если что-то и позволяет опечаткам ускользнуть, я не могу понять, когда вы действительно захотите проверить тип необъявленных переменных.Еще одна причина использования typeof-варианта:
undefined
может быть переопределена.Результат
typeof variable
не может.Обновление : обратите внимание, что в ES5 дело обстоит иначе: глобальное свойство
undefined
является неконфигурируемым и не записываемым свойством:Но он все еще может быть скрыт локальной переменной:
или параметр:
источник
undefined
свойство не может быть переопределено в ES5, но все еще может быть затенено локальной переменной.void 0
короче и безопаснее.Потому
undefined
что не всегда объявляется, но jQuery объявляетundefined
в своей основной функции. Таким образом, они используют безопасноеundefined
значение внутри, но снаружи они используютtypeof
стиль, чтобы быть безопасными.источник
Кто заинтересован в повышении производительности
variable === undefined
, может взглянуть сюда, но, похоже, это только оптимизация Chrome.источник
Для локальных переменных проверка с помощью
localVar === undefined
будет работать, потому что они должны быть определены где-то в локальной области видимости, или они не будут считаться локальными.Для переменных, которые не являются локальными и нигде не определены, проверка
someVar === undefined
вызовет исключение: Uncaught ReferenceError: j не определеноВот код, который прояснит то, что я говорю выше. Пожалуйста, обратите внимание на встроенные комментарии для дальнейшей ясности .
Если мы назовем приведенный выше код так:
Выход будет такой:
Если мы вызываем приведенный выше код следующим образом (с любым значением на самом деле):
Выход будет:
Когда вы делаете проверку следующим образом:
typeof x === 'undefined'
вы, по сути, спрашиваете следующее: Пожалуйста, проверьте, существует ли переменнаяx
(была определена) где-то в исходном коде. (более или менее). Если вы знаете C # или Java, этот тип проверки никогда не выполняется, потому что если он не существует, он не будет компилироваться.<== Fiddle Me ==>
источник
Резюме:
Когда в глобальной области мы на самом деле хотим вернуть true, если переменная не объявлена или имеет значение
undefined
:Потому что в глобальной области мы не уверены на 100%, если объявлена переменная, это может дать нам referenceError. Когда мы используем
typeof
оператор для неизвестной переменной, мы не получаем эту проблему, когда переменная не объявлена:Это связано с тем, что
typeof
оператор возвращает строку,undefined
когда переменная не объявлена или в настоящее время содержит значение,undefined
которое является именно тем, что мы хотим.undefined
источник
typeof a === 'undefined'
быстрее, чемa === 'undefined'
примерно в 2 раза на узле v6.9.1.источник
undefined
в виду во второй части, а не'undefined'