Какой метод проверки, если переменная была инициализирована, лучше / правильнее? (Предполагая, что переменная может содержать что угодно (строка, int, объект, функция и т. Д.))
if (elem) { // or !elem
или
if (typeof(elem) !== 'undefined') {
или
if (elem != null) {
javascript
variables
initialization
undefined
Самуэль Лев
источник
источник
foo
объявлено, либоtypeof foo === 'undefined'
илиtypeof foo === typeof undefined
undefined
. Правильный ответhasOwnProperty('bar')
не имеет тех же недостатков, что и другие, но потребует некоторой корректировки для Node (заменитьwindow
наglobal
).Ответы:
Вы хотите, чтобы
typeof
оператор . В частности:источник
typeof
Оператор будет проверять , если переменная действительно не определена.typeof
Оператор, в отличие от других операторов, не бросает ReferenceError исключение при использовании с необъявленной переменной.Тем не менее, обратите внимание, что
typeof null
вернется"object"
. Мы должны быть осторожны, чтобы избежать ошибки инициализации переменнойnull
. Чтобы быть в безопасности, это то, что мы могли бы использовать вместо этого:Для получения дополнительной информации об использовании строгого сравнения
===
вместо простого равенства==
см .:Какой оператор равенства (== vs ===) следует использовать в сравнениях JavaScript?
источник
if(! variable_here)
сломается во многих случаях. Если переменная равна 0 или ложь, произойдет сбой. Это не то, что вы хотите.typeof foo === "undefined"
это правильно, и лучше, чем ответ с наибольшим количеством голосов, но дополнительные примечания только запутывают этот ответ.Во многих случаях используют:
сделает работу за вас! ... это проверит следующие случаи:
undefined
''
Таким образом, он будет охватывать все случаи, но всегда есть странные случаи, которые мы также хотели бы охватить, например, строка с пробелами, как этот
' '
, это будет определено в javascript, так как имеет пробелы внутри строки ... например, в этом случае вы добавляете еще одну проверку с помощью trim (), например:Кроме того, эти проверки предназначены только для значений , поскольку объекты и массивы работают по-разному в Javascript, пустой массив
[]
и пустой объект{}
всегда имеют значение true .Я создаю изображение ниже, чтобы показать краткий ответ:
источник
if(elem)
проверяет неопределенность (в то время как он возвращает не определенную ошибку), не так ли?В JavaScript переменная может быть определена, но содержит значение
undefined
, поэтому наиболее распространенный ответ не является технически правильным и вместо этого выполняет следующее:Это может быть достаточно для ваших целей. Следующий тест имеет более простую семантику, которая позволяет точно описать поведение вашего кода и понять его самостоятельно (если вы заботитесь о таких вещах):
Это, конечно, предполагает, что вы работаете в браузере (где
window
это имя для глобального объекта). Но если вы возитесь с такими глобалами, вы, вероятно, в браузере. Субъективно использование'name' in window
стилистически согласуется с использованиемwindow.name
для обозначения глобалов. Доступ к глобальным переменным как к свойствам,window
а не как к переменным позволяет минимизировать количество необъявленных переменных, на которые вы ссылаетесь в своем коде (для облегчения линтинга), и исключает возможность того, что глобальные переменные будут скрыты локальной переменной. Кроме того, если глобалы заставляют вашу кожу ползти, вам будет удобнее прикасаться к ним только этой относительно длинной палкой.источник
В большинстве случаев вы бы использовали:
В отличие от простого
if (elem)
, это позволяет0
,false
,NaN
и''
, но отвергаетnull
илиundefined
, что делает его хорошим, общий тест на наличие аргумента или свойство объекта.Другие проверки также не являются правильными, они просто используются по-разному:
if (elem)
: Может быть использован , еслиelem
гарантированно будет объект, или еслиfalse
,0
и т.д. считаются значения « по умолчанию» (следовательно , эквивалентноundefined
илиnull
).typeof elem == 'undefined'
может использоваться в тех случаях, когда указанноеnull
имеет особое значение для неинициализированной переменной или свойства.elem
она не объявлена (т. Е. Нетvar
оператора, не является свойствомwindow
или не является аргументом функции). Это, на мой взгляд, довольно опасно, поскольку позволяет незаметно проскальзывать опечаткам. Чтобы избежать этого, см. Метод ниже.Также полезно строгое сравнение с
undefined
:Однако, поскольку глобальное значение
undefined
может быть переопределено другим значением, лучше всего объявить переменнуюundefined
в текущей области видимости перед ее использованием:Или:
Вторым преимуществом этого метода является то, что минификаторы JS могут уменьшить
undefined
переменную до одного символа, экономя каждый раз несколько байтов.источник
undefined
. Я даже не думаю, что стоит упомянуть в ответе. Вероятно, единственное худшее приемлемое имя переменной во всем Javascript.window.
перед переменной, если она используется в глобальном контексте ... это не лучший способ.void(0)
вместоundefined
.false
,0
и т.д. , как недопустимые значения.Проверьте, если
window
.hasOwnProperty
( "varname
" )Альтернатива множеству
typeof
ответов;Глобальные переменные объявлены с
var varname = value;
оператором в глобальной области видимостиКак таковой,
hasOwnProperty()
метод, которыйvar
из «» перем объявлена глобально т.е. является собственностьюwindow
.Самое замечательное в
hasOwnProperty()
том, что при его вызове мы не используем переменную, которая пока еще не может быть объявлена, что, конечно же, составляет половину проблемы.Хотя это и не всегда в совершенен или идеального решения, при определенных обстоятельствах, это просто работа!
Ноты
Вышесказанное верно при использовании
var
для определения переменной , в отличие отlet
которой:Для полноты:
const
константы по определению не являются на самом деле переменными (хотя их содержание может быть); более актуально:Поскольку
let
переменные илиconst
константы никогда не являются свойствами какого-либо объекта, унаследовавшегоhasOwnProperty()
метод, его нельзя использовать для проверки их существования.Относительно наличия и использования
hasOwnProperty()
:источник
true
(например,window.hasOwnProperty('console')
илиvar hop = "p";window.hasOwnProperty('hop')
).typeof
ответы просто пропускают.let
которых эти переменные недоступны, как свойства объектаwindow
[или любого другого доступного].hasOwnProperty
проверяет наличие свойств , а не переменных, и, следовательно, не может использоваться для обнаружения переменных, определенныхlet
.var
и в этом отношении не устарел. Тем не менее, я добавил примечание, описывающее, как использованиеlet
иconst
отличается от использованияvar
. Спасибо за ваше вдохновение; вместе мы поднимаемся :)hasOwnProperty
можно использовать только в установленном порядке для проверки существованияvar
переменных. Это звучит хорошо для меня.Как проверить, существует ли переменная
Это довольно пуленепробиваемое решение для тестирования, если переменная существует и была инициализирована:
Это чаще всего используется в сочетании с троичным оператором для установки значения по умолчанию, если определенная переменная не была инициализирована:
Проблемы с инкапсуляцией
К сожалению, вы не можете просто заключить свой чек в функцию.
Вы можете подумать о том, чтобы сделать что-то вроде этого:
Однако это вызовет ошибку ссылки, если вы звоните, например.
isset(foo)
и переменнаяfoo
не была определена, потому что вы не можете передать несуществующую переменную в функцию:Проверка, не определены ли параметры функции
Хотя наша
isset
функция не может использоваться для проверки существования переменной или ее отсутствия (по причинам, объясненным выше), она позволяет нам проверить, являются ли параметры функции неопределенными:Даже если никакое значение для
y
не передается функцииtest
, нашаisset
функция прекрасно работает в этом контексте, потому чтоy
в функции она известнаtest
какundefined
значение.источник
Есть еще один короткий способ проверить это, когда вы выполняете простые назначения и связанные проверки. Просто используйте условный (троичный) оператор.
Также это будет полезно, когда вы попытаетесь объявить глобальную переменную с назначением экземпляра ссылочной переменной.
Если вы хотите проверить переменную не должно быть
undefined
илиnull
. Затем выполните проверку ниже.Когда переменная объявлена, и если вы хотите проверить значение, это даже просто: она будет выполнять
undefined
иnull
проверять вместе.источник
typeof(booooo)
есть,"undefined"
тоtypeof(typeof boooooo)
есть"string"
иtypeof boooooo && true
всегдаtrue
. Ответ @ John-Slegers примерно такой же сокращенный, как вы можете получить с помощью typeof.If you wanted to check variable shouldn't be undefined or null.
По этому комментарию ясно сказано, что не нужно выполнять проверку объявления переменных. это проверить значение переменной.Краткий способ проверки переменной не объявлен (не определен)
Я нашел это полезным для обнаружения скрипта, работающего вне браузера (без объявленной
window
переменной).источник
window.bar=undefined
определяется и устанавливается значение. Ваш ответ не может обнаружить разницу между этим и, если переменная не существует. Если бы тыthis.hasOwnProperty('bar')
это сделал, это могло бы сработать.const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();
. Переменнаяx
определена, но возвращается false ...Это зависит от того, просто ли вам важно, что переменная определена или вы хотите, чтобы она имела значимое значение.
Проверка, является ли тип неопределенным, проверит, была ли переменная еще определена.
=== null
или!== null
только проверит, точно ли значение переменнойnull
.== null
или!= null
проверит, является ли значениеundefined
илиnull
.if(value)
будет проверять , если переменнаяundefined
,null
,0
или пустая строка.источник
Самый высокий ответ правильный, используйте typeof.
Однако я хотел отметить, что в JavaScript
undefined
изменчиво (по какой-то безбожной причине). Поэтому простое выполнение проверкиvarName !== undefined
может не всегда возвращаться так, как вы ожидаете, потому что другие библиотеки могли измениться неопределенно. Некоторые ответы (например, @ skalee's) предпочитают не использоватьtypeof
, и это может привести к неприятностям.«Старый» способ справиться с этим - объявить undefined как переменную, чтобы компенсировать любое потенциальное отключение звука
undefined
. Тем не менее, лучший способ по-прежнему использовать,typeof
потому что он игнорирует любые переопределенияundefined
из другого кода. Особенно, если вы пишете код для использования в дикой природе, где кто знает, что еще может быть запущено на странице ...источник
varName !== undefined
просто вызовет ReferenceError. Изменчивостьundefined
не имеет значения.undefined
это свойство только для чтения. Однако, чтобы быть пуленепробиваемым вы можете использоватьtypeof mvVar === typeof void 0
.void 0
возвращаетсяundefined
всегда.Или лучше
Работает во всех браузерах
источник
Чтобы внести свой вклад в дискуссию, если я знаю, что переменная должна быть строкой или объектом, который я всегда предпочитаю
if (!variable)
, так что проверяйте, не ложно ли оно. Это может привести к более чистому коду, например:.. может быть уменьшено до:
источник
''
вашему решению, он будет считать его неопределенным, когда он фактически определен как содержащий пустую строку.Трудно различить неопределенное и нулевое. Null - это значение, которое вы можете присвоить переменной, если хотите указать, что переменная не имеет определенного значения. Undefined - это специальное значение, которое будет значением по умолчанию для неназначенных переменных.
источник
Нулевое значение в JavaScript и
typeof null
возвращает"object"
Поэтому принятый ответ не будет работать, если вы передадите нулевые значения. Если вы передаете нулевые значения, вам нужно добавить дополнительную проверку для нулевых значений:
источник
Самая надежная проверка 'это определено' с typeof
Если вы просто проверяете определенную переменную, чтобы назначить значение по умолчанию, для удобного чтения одной строки вы часто можете сделать это:
Это часто хорошо использовать, см .: Идиоматический способ установить значение по умолчанию в JavaScript
Есть также этот вкладыш, использующий ключевое слово typeof :
источник
Вы можете использовать
typeof
оператор.Например,
Вышеупомянутый фрагмент кода вернет вывод как
источник
Чтобы проверить, была ли переменная объявлена / установлена, я сделал этот подвох.
Я не нашел способ извлечь код в функцию, даже с
eval
.источник
Эти ответы (кроме решения Фреда Гандта) являются либо неправильными, либо неполными.
Предположим, мне нужно,
variableName;
чтобы my имелundefined
значение, и поэтому оно было объявлено таким образом,var variableName;
что означает, что оно уже инициализировано ; - Как я могу проверить, если он уже объявлен?Или еще лучше - как я могу сразу проверить, существует ли «Book1.chapter22.paragraph37» при одном вызове, но не вызвать ошибку ссылки?
Мы делаем это, используя самый мощный оператор JasvaScript, оператор in . :
Во времена пиковой популярности AJAX я написал метод (позже названный) isNS (), который способен определить, существует ли пространство имен, включая глубокие тесты для имен свойств, такие как «Book1.chapter22.paragraph37» и многое другое.
Но так как он был ранее опубликован и из-за его большой важности он заслуживает публикации в отдельном потоке, я не буду публиковать его здесь, но предоставлю ключевые слова ( javascript + isNS ), которые помогут вам найти исходный код, поддержанный всеми необходимые объяснения.
источник
in
Оператор проверяет только наличие собственности, а не все переменные свойства -const
иlet
декларация не является (иconst
не являются даже, ну, переменными ).const
иlet
были стандартизированы с ECMAScript 2015, который был опубликован более 3 лет назад и с тех пор был хорошо принят обычными подозреваемыми и сегодня используется довольно широко, смею сказать, - на Github существует более 2 миллионов случаев «const» в файлах JS .in
оператор для общего тестирования, существует ли переменная , потому что «const и let не являются [свойствами]» - хотя наconst
самом деле можно сказать, что он вводит постоянную ссылку, так как отличие от переменной ссылки,let
с другой стороны, на самом деле ввести переменную ссылку - это, другими словами, любая мера, переменной и ваш ответ неверен в это означает , что вы можете проверить , является ли переменная определяетсяlet
существует с помощьюin
оператора - вы не можете.window
объекта, я не знаю, как вам это объяснить.let
ключевого слова. Это все, на что я указывал.В конкретной ситуации, изложенной в вопросе,
идентично
Я предпочитаю последнее, так как оно короче.
Обратите внимание, что мы ищем
console
только в глобальной области (которая являетсяwindow
объектом во всех браузерах). В этой конкретной ситуации это желательно. Мы не хотимconsole
определяться в другом месте.@BrianKelley в своем великолепном ответе объясняет технические детали. Я только добавил недостающее заключение и переварил его во что-то более простое для чтения.
источник
Я использую два разных способа в зависимости от объекта.
Иногда я не хочу оценивать пустую строку как Falsey, поэтому я использую этот случай
Если вам нужно обратное, то в первом случае переменная становится переменной !!, а в недопустимой функции === становится! =, А имена функций изменяются на notInvalid.
источник
Мое предпочтение
typeof(elem) != 'undefined' && elem != null
.Как бы вы ни выбрали, подумайте над тем, чтобы поставить проверку в такую функцию
Если вы не знаете, объявлена ли переменная, продолжайте с
typeof (x) != 'undefined' && x != null;
Если вы знаете, что переменная объявлена, но может не существовать, вы можете использовать
Переменная, которую вы проверяете, иногда может быть вложенным свойством. Вы можете использовать опору || {}, чтобы пройти строку, проверяющую существование рассматриваемого свойства:
После каждого свойства используйте (... '|| {}'). NextProp, чтобы отсутствующее свойство не выдавало ошибку.
Или вы можете использовать существующий как
existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)
источник
typeof (x) != 'undefined' && x != null
эквивалентно тому,x != null
когдаx
объявлено.Это зависит от ситуации. Если вы проверяете что-то, что может или не может быть определено глобально вне вашего кода (например, jQuery), вы хотите:
(Нет необходимости в строгом равенстве, typeof всегда возвращает строку.) Но если у вас есть аргументы для функции, которые могут или не могли быть переданы, они всегда будут определены, но будут пустыми, если опущены.
источник
Попробуйте поймать
Если переменная вообще не была определена, вы можете проверить это без выполнения кода разрыва, используя блок try-catch следующим образом (вам не нужно
use strict
переключаться в режим)Показать фрагмент кода
БОНУС: (ссылаясь на другие ответы) Почему
===
это более понятно, чем==
( источник )если (а == б)
если (а === б)
источник
Я удивлен, что это еще не было упомянуто ...
вот несколько дополнительных вариантов, использующих
this['var_name']
Преимущество использования этого метода в том, что его можно использовать до определения переменной.
источник
window.bar=undefined
определяется и устанавливается значение. Ваш ответ не может обнаружить разницу между этим и, если переменная не существует. Если бы тыthis.hasOwnProperty('bar')
это сделал, это могло бы сработать.Вы можете использовать блок try ... catch следующим образом:
Показать фрагмент кода
Недостатком является то, что вы не можете поместить его в функцию, так как это вызовет ReferenceError.
источник