Проверка существования переменной в JavaScript (определена/инициализирована)
Вопрос: Какой метод проверки инициализации переменной лучше/правильнее?
Предполагая, что переменная может содержать любое значение (строка, число, объект, функция и т. д.), какой из следующих способов проверки инициализации переменной является наиболее подходящим?
Использовать проверку истинности:
if (elem) { // или !elem
Проверять на определенность типа:
if (typeof elem !== 'undefined') {
Проверять на равенство
null
:if (elem != null) {
Каков правильный подход в различных ситуациях, и есть ли какие-либо риски или подводные камни, связанные с каждым из этих методов?
5 ответ(ов)
В 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
вместо обращения к ним как к переменным позволяет минимизировать количество неопределённых переменных в вашем коде (в пользу линтинга) и избежать ситуации, когда ваша глобальная переменная будет затенена локальной. Кроме того, если глобальные переменные вызывают у вас дискомфорт, вам, возможно, будет удобнее взаимодействовать с ними только через этот относительно длинный инструмент.
В большинстве случаев рекомендуется использовать следующий подход:
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
до одного символа, что экономит несколько байтов каждый раз.
Короткий способ проверить, что переменная не объявлена (не равна undefined
), это использовать следующий код:
if (typeof variable === "undefined") {
...
}
Я нашёл это полезным для определения выполнения скрипта вне браузера, где переменная window
может не быть объявлена.
Есть еще один короткий способ проверить это при выполнении простых присваиваний и связанных проверок. Используйте условный (тернарный) оператор.
var values = typeof variable !== 'undefined' ? variable : '';
Это также будет полезно, когда вы пытаетесь объявить глобальную переменную с присвоением экземпляра переменной-ссылки.
Если вы хотите убедиться, что переменная не равна undefined
или null
, выполните следующую проверку.
Когда переменная объявлена, и если вы хотите проверить её значение, это еще проще: при этом будет выполняться проверка на undefined
и null
одновременно.
var values = variable ? variable : '';
Это зависит от того, важно ли вам просто удостовериться, что переменная была определена, или вы хотите, чтобы у нее было значимое значение.
Проверка типа на undefined
подтвердит, что переменная была определена.
Использование === null
или !== null
проверяет, является ли значение переменной точно null
.
Записи == null
или != null
проверяют, равно ли значение undefined
или null
.
Конструкция if(value)
проверяет, является ли переменная undefined
, null
, 0
или пустой строкой.
Как определить, является ли переменная 'undefined' или 'null'?
Каков объем видимости переменных в JavaScript?
Как проверить неопределённую переменную в JavaScript
Установка значения по умолчанию для параметра функции в JavaScript
Почему null является объектом и в чем разница между null и undefined?