Я знаю, что есть два метода, чтобы определить, существует ли переменная и не нуль(ложь, пустые) в JavaScript:
Если ( typeof на имя_переменной !== 'не определено' &&усилителя; имяпеременной )
Если ( окна.имяпеременной )
какой из них более предпочтительный и почему?
Переменная заявил Если доступа к имени переменной не будет производить ReferenceError
. Выражение typeof на имя_переменной !== 'не определено'
будут false
в только одном из двух случаев:
ВАР имя_переменной
в области видимости), orВ противном случае, сравнение возвращает значение true
.
Если вы действительно хотите проверить, если переменная объявлена или нет, вы'll необходимо, чтобы поймать
любой ReferenceError
произведены попытки сослаться на него:
var barIsDeclared = true;
try{ bar; }
catch(e) {
if(e.name == "ReferenceError") {
barIsDeclared = false;
}
}
Если вы просто хотите проверить, если переменная, объявленная'значение не является ни неопределенный
, ни нуль
, вы можете просто проверить это:
if (variableName !== undefined && variableName !== null) { ... }
Или, что эквивалентно, с нестрогом проверить равенство против нуль
:
if (variableName != null) { ... }
Как ваш второй пример и ваше правое выражение в &&усилителя;
проверяет, если значение является "falsey-то", т. е., если это приводит к false в булевом контексте. Такие значения: нуль
, ложь
, 0
, и с пустой строкой, не все из которых вы, возможно, захотите отказаться.
Важно отметить, что 'не определено' - это вполне допустимое значение для переменной для хранения. Если вы хотите проверить, если переменная существует на всех,
if (window.variableName)
более полную проверку, так как это проверка того, что переменная фактически был определен. Однако, это только полезно, если переменная гарантированно будет объект! Кроме того, как уже указывалось, это может также возвращать значение false, если значение имяпеременной является ложным, 0, '', или нуль.
Что говорит, что, как правило, не достаточно для наших повседневных целей, так как мы часто не'т хотите иметь неопределенное значение. Таким образом, вы должны сначала проверить, чтобы увидеть, что переменная объявлена, а потом утверждать, что не определено с помощью оператора typeof, который, как Адам отметил, что не будет возвращать undefined, если переменная действительно является неопределенным.
if ( variableName && typeof variableName !== 'undefined' )
Если вы хотите проверить, если переменная (скажем, V) было определено и не равно null:
if (typeof v !== 'undefined' && v !== null) {
// Do some operation
}
Если вы хотите проверить для всех значений ложь, такие как: не определено
, нуль
, ''
, 0
, `значение false:
if (v) {
// Do some operation
}
Я'м пишу ответ только потому, что у меня не хватает репутации, чтобы прокомментировать принятый ответ от apsillers. Я согласен с его ответом, но
если вы действительно хотите проверить, если переменная является незаявленной, вы'll необходимо, чтобы поймать ReferenceError ...
это не единственный способ. Можно сделать просто:
this.hasOwnProperty("bar")
чтобы проверить, есть ли переменная бар объявлен в текущем контексте. (Я'м не уверен, но вызова метод hasOwnProperty можно было бы также более быстрое/эффективное исключение) Это работает только для текущего контекста (не для всей текущей области).
if ( typeof variableName !== 'undefined' && variableName )
//// could throw an error if var doesnt exist at all
if ( window.variableName )
//// could be true if var == 0
////further on it depends on what is stored into that var
// if you expect an object to be stored in that var maybe
if ( !!window.variableName )
//could be the right way
best way => see what works for your case
`если (переменная) может быть использован, если переменная будет гарантированно объекта, или если false, 0 и т. д. считается, что "по умолчанию" и ценностей (и, следовательно, эквивалентно undefined или null).
`переменная для вызова typeof == 'не определено' может быть использован в тех случаях, когда указанное значение null имеет особый смысл в неинициализированное переменной или свойства. Эта проверка не бросит и ошибка переменная не объявлена.
Я нашел это короче и гораздо лучше:
if(varName !== (undefined || null)) { //do something }