24

Проверка существования переменной в JavaScript (определена/инициализирована)

12

Вопрос: Какой метод проверки инициализации переменной лучше/правильнее?

Предполагая, что переменная может содержать любое значение (строка, число, объект, функция и т. д.), какой из следующих способов проверки инициализации переменной является наиболее подходящим?

  1. Использовать проверку истинности:

    if (elem) { // или !elem
    
  2. Проверять на определенность типа:

    if (typeof elem !== 'undefined') {
    
  3. Проверять на равенство null:

    if (elem != null) {
    

Каков правильный подход в различных ситуациях, и есть ли какие-либо риски или подводные камни, связанные с каждым из этих методов?

5 ответ(ов)

2

В JavaScript переменная может быть объявлена, но иметь значение undefined, поэтому наиболее распространённый ответ не является технически корректным. Вместо этого можно использовать следующий код:

if (typeof v === "undefined") {
   // переменная "v" не определена в текущей области видимости
   // *или* переменная "v" существует и ей назначено значение undefined
} else {
   // переменная (глобальная или локальная) "v" определена в текущей области видимости
   // *и* она содержит значение, отличное от undefined
}

Это может быть достаточно для ваших нужд. Следующий тест имеет более простую семантику, что облегчает точное описание поведения вашего кода и его понимание (если вам это важно):

if ("v" in window) {
   // глобальная переменная "v" определена
} else {
   // глобальная переменная "v" не определена
}

При этом предполагается, что вы работаете в браузере (где window — это обозначение глобального объекта). Но если вы играете с глобальными переменными таким образом, вы, вероятно, находитесь в браузере. Субъективно, использование 'name' in window стилистически соответствует обращению к глобальным переменным через window.name. Доступ к глобальным переменным как к свойствам window вместо обращения к ним как к переменным позволяет минимизировать количество неопределённых переменных в вашем коде (в пользу линтинга) и избежать ситуации, когда ваша глобальная переменная будет затенена локальной. Кроме того, если глобальные переменные вызывают у вас дискомфорт, вам, возможно, будет удобнее взаимодействовать с ними только через этот относительно длинный инструмент.

1

В большинстве случаев рекомендуется использовать следующий подход:

elem != null

В отличие от простого if (elem), этот способ позволяет принимать значения 0, false, NaN и '', но отсекает null и undefined. Это делает его хорошим и универсальным способом проверки наличия аргумента или свойства объекта.


Другие проверки тоже не являются неверными, они просто предназначены для различных случаев использования:

  • if (elem): можно использовать, если вы уверены, что elem является объектом, или если такие значения, как false, 0 и т.д., считаются «значениями по умолчанию» (таким образом эквивалентны undefined или null).

  • typeof elem == 'undefined' может быть использован в случаях, когда заданный null имеет особое значение для неинициализированной переменной или свойства.

    • Это единственная проверка, которая не вызовет ошибку, если elem не объявлен (т.е. нет var, это не свойство window и не аргумент функции). На мой взгляд, это довольно опасно, так как может позволить пропустить опечатки. Чтобы избежать этого, смотрите метод ниже.

Также полезно выполнять строгое сравнение с undefined:

if (elem === undefined) ...

Тем не менее, поскольку глобальный undefined может быть переопределен другим значением, лучше всего объявить переменную undefined в текущей области видимости перед ее использованием:

var undefined; // действительно undefined
if (elem === undefined) ...

Или:

(function (undefined) {
    if (elem === undefined) ...
})();

Дополнительным преимуществом этого метода является то, что минификаторы JS могут сократить переменную undefined до одного символа, что экономит несколько байтов каждый раз.

0

Короткий способ проверить, что переменная не объявлена (не равна undefined), это использовать следующий код:

if (typeof variable === "undefined") {
  ...
}

Я нашёл это полезным для определения выполнения скрипта вне браузера, где переменная window может не быть объявлена.

0

Есть еще один короткий способ проверить это при выполнении простых присваиваний и связанных проверок. Используйте условный (тернарный) оператор.

var values = typeof variable !== 'undefined' ? variable : '';

Это также будет полезно, когда вы пытаетесь объявить глобальную переменную с присвоением экземпляра переменной-ссылки.

Если вы хотите убедиться, что переменная не равна undefined или null, выполните следующую проверку.

Когда переменная объявлена, и если вы хотите проверить её значение, это еще проще: при этом будет выполняться проверка на undefined и null одновременно.

var values = variable ? variable : '';
0

Это зависит от того, важно ли вам просто удостовериться, что переменная была определена, или вы хотите, чтобы у нее было значимое значение.

Проверка типа на undefined подтвердит, что переменная была определена.

Использование === null или !== null проверяет, является ли значение переменной точно null.

Записи == null или != null проверяют, равно ли значение undefined или null.

Конструкция if(value) проверяет, является ли переменная undefined, null, 0 или пустой строкой.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь