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


1767

Какой метод проверки, если переменная была инициализирована, лучше / правильнее? (Предполагая, что переменная может содержать что угодно (строка, int, объект, функция и т. Д.))

if (elem) { // or !elem

или

if (typeof(elem) !== 'undefined') {

или

if (elem != null) {

5
если вы хотите знать , является ли fooобъявлено, либо typeof foo === 'undefined'илиtypeof foo === typeof undefined

1
Ответы с большим количеством голосов не работают для переменных, которые объявлены, но имеют значение undefined. Правильный ответ
Пол

@Paulpro, используемая версия hasOwnProperty('bar')не имеет тех же недостатков, что и другие, но потребует некоторой корректировки для Node (заменить windowна global).
oligofren

@Paulpro Действительно, но, когда я размышлял над этим, прежде чем вы ответили, я пришел к выводу, что это не совсем практическая проблема. Когда вы имеете дело с блочными или функциональными переменными, это, как правило, код, которым вы владеете или у которого есть доступ на запись, поэтому в любом случае вы будете иметь ошибку во время выполнения, которую можно исправить. В то время как обычная проблема с переменными, которые не были определены (не существуют), обычно заключается в коде, находящемся вне вашего контроля, поэтому вам нужен способ его обнаружения. Так что это решение 80/20.
oligofren

Ответы:


3057

Вы хотите, чтобы typeofоператор . В частности:

if (typeof variable !== 'undefined') {
    // the variable is defined
}

35
Это выглядит хорошим решением, но можете ли вы объяснить, почему это работает?
Морган Ченг

46
На самом деле, вы должны проверить, что объект - это то, что вам нужно. Так было бы, если (typeof console == 'object') {// переменная - это то, что мне нужно, чтобы она была}
staticsan

59
@ Георгий IV: «просто делай` if (переменная) »- ну, нет, это не сработает для false и 0.
Джейсон С

17
'if (variable)' также не проходит проверку на наличие свойств объекта.
Скоттс

54
@ geowa4 На самом деле, это приведет к ошибке, если переменная не определена.
Кевинджи

857

typeofОператор будет проверять , если переменная действительно не определена.

if (typeof variable === 'undefined') {
    // variable is undefined
}

typeofОператор, в отличие от других операторов, не бросает ReferenceError исключение при использовании с необъявленной переменной.

Тем не менее, обратите внимание, что typeof nullвернется "object". Мы должны быть осторожны, чтобы избежать ошибки инициализации переменной null. Чтобы быть в безопасности, это то, что мы могли бы использовать вместо этого:

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

Для получения дополнительной информации об использовании строгого сравнения ===вместо простого равенства ==см .:
Какой оператор равенства (== vs ===) следует использовать в сравнениях JavaScript?


2
if (! variable_here) {// ваш код здесь. }; не могу сказать, является ли переменная ложной или неопределенной
boh

5
if(! variable_here)сломается во многих случаях. Если переменная равна 0 или ложь, произойдет сбой. Это не то, что вы хотите.
Кори Дэниелсон

2
не могу решить, стоит ли голосовать. Строго говоря, typeof foo === "undefined"это правильно, и лучше, чем ответ с наибольшим количеством голосов, но дополнительные примечания только запутывают этот ответ.
Альнитак,

1
@ StevenPenny Проверьте сроки. Верхний ответ был объединен с другим вопросом после того, как этот ответ был опубликован
Роб

1
Этот ответ не работает. Это единственный ответ, который работает здесь: stackoverflow.com/a/36432729/772035
Пол

222

Во многих случаях используют:

if (elem) { // or !elem

сделает работу за вас! ... это проверит следующие случаи:

  1. undefined : если значение не определено и оноundefined
  2. нуль : если это ноль, например, если элемент DOM не существует ...
  3. пустая строка :''
  4. 0 : число ноль
  5. NaN : не число
  6. ложный

Таким образом, он будет охватывать все случаи, но всегда есть странные случаи, которые мы также хотели бы охватить, например, строка с пробелами, как этот ' ', это будет определено в javascript, так как имеет пробелы внутри строки ... например, в этом случае вы добавляете еще одну проверку с помощью trim (), например:

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

Кроме того, эти проверки предназначены только для значений , поскольку объекты и массивы работают по-разному в Javascript, пустой массив []и пустой объект {}всегда имеют значение true .

Я создаю изображение ниже, чтобы показать краткий ответ:

неопределенное, нулевое и т. д.


2
@Alireza, хорошо! Ваш ответ поможет многим людям там. Я уже запомнил эти ложные значения, единственное, в чем я не был уверен, было [].
Тьяго Йойти

13
Я получаю "ReferenceError: элемент не определен"
ropo

3
@ropo, это потому, что вы даже не определили элемент, чтобы проверить, что это такое, если это ваш случай, вы должны проверить его с помощью typeof (elem) === "string", которая уже упоминалась ...
Alireza

19
Тогда ответ вводит в заблуждение, когда он говорит, что if(elem)проверяет неопределенность (в то время как он возвращает не определенную ошибку), не так ли?
Фанки

1
Дайте мне вариант использования для проверки, если переменная не определена и если определено с неопределенным значением? Некоторые из вас цепляются за соломинку и пытаются выглядеть блестяще, но если вы устанавливаете значение как неопределенное и проверяете это значение, оно, очевидно, вернет false или вам нужно изменить свой код, smh .... этот ответ правильный !! !!!
almcaffee

210

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

if (typeof v === "undefined") {
   // no variable "v" is defined in the current scope
   // *or* some variable v exists and has been assigned the value undefined
} else {
   // some variable (global or local) "v" is defined in the current scope
   // *and* it contains a value other than undefined
}

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

if ("v" in window) {
   // global variable v is defined
} else {
   // global variable v is not defined
}

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


7
Это только проверяет, была ли переменная объявлена ​​глобально. Если вы кодируете правильно, то вы ограничиваете свои глобальные переменные. Он сообщит false для локальных переменных: (function () {var sdfsfs = 10; console.log ("sdfsfs" в окне);}) () `
Эдди Монж, младший

2
Это самый лучший ответ. Я был в самом конце этого, пытаясь понять, как объяснить именно этот угловой случай. Brilliant. Не знал, что ты сможешь это сделать.
temporary_user_name

1
Heads-up: ваш ответ перенесен сюда из stackoverflow.com/questions/519145/…
Shog9

Для пользователей Angular: К сожалению, это не разрешено в выражении ng-if.
qwertzguy

... идеальный проект для проверки по объему. есть ли у вас какие-либо показатели производительности, если «в окне» или «(переменная typeof === 'undefined' || variable === null)". На самом деле меня интересует неопровержимая проверка фактов, а не аргументированное потенциальное обоснование (что я мог бы сделать сам: во втором предложении больше операций -> хуже производительность)
Quicker

119

В большинстве случаев вы бы использовали:

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; // really undefined
if (elem === undefined) ...

Или:

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

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


17
Я в шоке, что вы можете переопределить undefined. Я даже не думаю, что стоит упомянуть в ответе. Вероятно, единственное худшее приемлемое имя переменной во всем Javascript.
Кори Дэниелсон

2
Это вызывает исключение и требует, чтобы вы использовали window.перед переменной, если она используется в глобальном контексте ... это не лучший способ.
Алекс W

4
Из-за этой главной проблемы вы должны ВСЕГДА использовать void(0)вместо undefined.
Бартломей Залевский

+1 , так как этот ответ указывает, что иногда вы можете на самом деле хотите , чтобы идентифицировать false, 0и т.д. , как недопустимые значения.
Риного

77

Проверьте, если window. hasOwnProperty( " varname" )

Альтернатива множеству typeofответов;

Глобальные переменные объявлены с var varname = value;оператором в глобальной области видимости

могут быть доступны как свойства объекта окна.

Как таковой, hasOwnProperty()метод, который

возвращает логическое значение, указывающее, имеет ли объект указанное свойство как собственное свойство (в отличие от его наследования)

можно использовать для определения

varиз «» перем объявлена глобально т.е. является собственностью window.

// Globally established, therefore, properties of window
var foo = "whatever", // string
    bar = false,      // bool
    baz;              // undefined
//  window.qux does not exist

console.log( [
    window.hasOwnProperty( "foo" ), // true
    window.hasOwnProperty( "bar" ), // true
    window.hasOwnProperty( "baz" ), // true
    window.hasOwnProperty( "qux" )  // false
] );

Самое замечательное в hasOwnProperty()том, что при его вызове мы не используем переменную, которая пока еще не может быть объявлена, что, конечно же, составляет половину проблемы.

Хотя это и не всегда в совершенен или идеального решения, при определенных обстоятельствах, это просто работа!

Ноты

Вышесказанное верно при использовании varдля определения переменной , в отличие от letкоторой:

объявляет локальную переменную области видимости блока, необязательно инициализируя ее значением.

отличается от varключевого слова, которое определяет переменную глобально или локально для всей функции независимо от области видимости блока.

На верхнем уровне программ и функций, в letотличие var, не создается свойство глобального объекта.

Для полноты: const константы по определению не являются на самом деле переменными (хотя их содержание может быть); более актуально:

Глобальные константы не становятся свойствами объекта окна, в отличие от varпеременных. Требуется инициализатор для константы; то есть вы должны указать его значение в том же операторе, в котором он объявлен.

Значение константы не может быть изменено путем переназначения, и оно не может быть повторно объявлено.

Объявление const создает доступную только для чтения ссылку на значение. Это не означает, что значение, которое оно содержит, является неизменным, просто то, что идентификатор переменной не может быть переназначен.

Поскольку letпеременные или constконстанты никогда не являются свойствами какого-либо объекта, унаследовавшего hasOwnProperty()метод, его нельзя использовать для проверки их существования.

Относительно наличия и использования hasOwnProperty():

Каждый объект, произошедший от Object, наследует hasOwnProperty()метод. [...] в отличие от inоператора, этот метод не проверяет цепочку прототипов объекта.


1
Это отличная альтернатива и должна быть на первом месте в этом вопросе. Пожалуйста, упростите заголовок ответа с рабочим примером, который возвращает true(например, window.hasOwnProperty('console')или var hop = "p";window.hasOwnProperty('hop')).
CPHPython

2
Наконец то, что не выдает ошибку из-за доступа к члену, который не существует ... Что-то, что все typeofответы просто пропускают.
Зельфир Кальцталь

1
Этот ответ устарел - для стандартного ECMAScript вы можете определить переменные, для letкоторых эти переменные недоступны, как свойства объекта window[или любого другого доступного]. hasOwnPropertyпроверяет наличие свойств , а не переменных, и, следовательно, не может использоваться для обнаружения переменных, определенных let.
атп

1
@amn Ответ остается верным относительно использования varи в этом отношении не устарел. Тем не менее, я добавил примечание, описывающее, как использование letи constотличается от использования var. Спасибо за ваше вдохновение; вместе мы поднимаемся :)
Фред Гандт

1
@amn Я переписал ответ (надеюсь, в последний раз), чтобы прояснить, что hasOwnPropertyможно использовать только в установленном порядке для проверки существования varпеременных. Это звучит хорошо для меня.
Фред Гандт

68

Как проверить, существует ли переменная

Это довольно пуленепробиваемое решение для тестирования, если переменная существует и была инициализирована:

var setOrNot = typeof variable !== typeof undefined;

Это чаще всего используется в сочетании с троичным оператором для установки значения по умолчанию, если определенная переменная не была инициализирована:

var dark = typeof darkColor !== typeof undefined ? darkColor : "black";

Проблемы с инкапсуляцией

К сожалению, вы не можете просто заключить свой чек в функцию.

Вы можете подумать о том, чтобы сделать что-то вроде этого:

function isset(variable) {
    return typeof variable !== typeof undefined;
}

Однако это вызовет ошибку ссылки, если вы звоните, например. isset(foo)и переменная fooне была определена, потому что вы не можете передать несуществующую переменную в функцию:

Uncaught ReferenceError: foo не определен


Проверка, не определены ли параметры функции

Хотя наша issetфункция не может использоваться для проверки существования переменной или ее отсутствия (по причинам, объясненным выше), она позволяет нам проверить, являются ли параметры функции неопределенными:

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

Даже если никакое значение для yне передается функции test, наша issetфункция прекрасно работает в этом контексте, потому что yв функции она известна testкак undefinedзначение.


41

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

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

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

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

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

var values = variable ? variable : '';

ответ, как это категорически неверно. Переменная typeof всегда возвращает строку, поэтому никогда не бывает ложной. Например, если typeof(booooo)есть, "undefined"то typeof(typeof boooooo)есть "string"и typeof boooooo && trueвсегда true. Ответ @ John-Slegers примерно такой же сокращенный, как вы можете получить с помощью typeof.
mpag

Это абсолютно правильный ответ . Вот рабочая скрипка . И я не знаю, о каком сценарии ты говоришь. Вопросы о проверке существования переменных.
РаджеКдев

@mpag Не говори плоско неправильно. Докажи это . Найти ошибку очень легко, вместо этого вы можете дать хорошие ответы здесь !!!. Если бы ответ был неверным, 28 программистов не проголосовали бы без проверки моего ответа. Поскольку здесь есть много предполагаемых ответов, они могли бы проголосовать за это, а не за это.
РаджеКдев

На самом деле второй кусок кода, не для проверки того же условия, что и выше. Я думал, что люди поймут по этой строке. If you wanted to check variable shouldn't be undefined or null.По этому комментарию ясно сказано, что не нужно выполнять проверку объявления переменных. это проверить значение переменной.
RajeshKdev

1
Ваш второй чек потерпит неудачу со значением 0
Фарид Алнамрути

31

Краткий способ проверки переменной не объявлен (не определен)

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

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


это «канонический путь», который является портативным?
Джейсон

3
Это не верно. window.bar=undefinedопределяется и устанавливается значение. Ваш ответ не может обнаружить разницу между этим и, если переменная не существует. Если бы ты this.hasOwnProperty('bar')это сделал, это могло бы сработать.
oligofren

этот код не работает, и вы можете проверить это с помощью любой консоли браузера
ha9u63ar

1
Посмотрим const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();. Переменная xопределена, но возвращается false ...
user2878850

29

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

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

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

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

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


12

Самый высокий ответ правильный, используйте typeof.

Однако я хотел отметить, что в JavaScript undefinedизменчиво (по какой-то безбожной причине). Поэтому простое выполнение проверки varName !== undefinedможет не всегда возвращаться так, как вы ожидаете, потому что другие библиотеки могли измениться неопределенно. Некоторые ответы (например, @ skalee's) предпочитают не использовать typeof, и это может привести к неприятностям.

«Старый» способ справиться с этим - объявить undefined как переменную, чтобы компенсировать любое потенциальное отключение звука undefined. Тем не менее, лучший способ по-прежнему использовать, typeofпотому что он игнорирует любые переопределения undefinedиз другого кода. Особенно, если вы пишете код для использования в дикой природе, где кто знает, что еще может быть запущено на странице ...


1
Суть спорная, потому что если varName не определено, то varName !== undefinedпросто вызовет ReferenceError. Изменчивость undefinedне имеет значения.
Wutaz

Heads-up: ваш ответ перенесен сюда из stackoverflow.com/questions/519145/…
Shog9

1
В новых версиях Javascript undefinedэто свойство только для чтения. Однако, чтобы быть пуленепробиваемым вы можете использовать typeof mvVar === typeof void 0. void 0возвращается undefinedвсегда.
kwarnke

11
if (typeof console != "undefined") {    
   ...
}

Или лучше

if ((typeof console == "object") && (typeof console.profile == "function")) {    
   console.profile(f.constructor);    
}

Работает во всех браузерах


3
Почему последнее лучше по вашему мнению?
Скали

3
@skalee Я согласен, что последнее лучше. Это по той простой причине, что вы проверяете, являются ли типы теми, которые вам нужны, прежде чем их использовать.
Broxzier

Heads-up: ваш ответ перенесен сюда из stackoverflow.com/questions/519145/…
Shog9

9

Чтобы внести свой вклад в дискуссию, если я знаю, что переменная должна быть строкой или объектом, который я всегда предпочитаю if (!variable), так что проверяйте, не ложно ли оно. Это может привести к более чистому коду, например:

if (typeof data !== "undefined" && typeof data.url === "undefined") {
    var message = 'Error receiving response';
    if (typeof data.error !== "undefined") {
        message = data.error;
    } else if (typeof data.message !== "undefined") {
        message = data.message;
    }
    alert(message); 
}

.. может быть уменьшено до:

if (data && !data.url) {
  var message = data.error || data.message || 'Error receiving response';
  alert(message)
} 


Это не то, что спросил ОП. Если data.url равен ''вашему решению, он будет считать его неопределенным, когда он фактически определен как содержащий пустую строку.
Demonblack

Я согласен не с тем, что спросили, и вы правы: пустая строка будет считаться неопределенной. Но я опубликовал это, потому что я думал, что это может быть полезно в дебатах, которые были созданы среди разных ответов. И в этом примере, как и во многих других случаях, вы просто хотите напечатать строку, если на самом деле есть контент, поэтому можно воспользоваться тем, что javascript считает ложную и пустую строку, и неопределенную
de3

8

Трудно различить неопределенное и нулевое. Null - это значение, которое вы можете присвоить переменной, если хотите указать, что переменная не имеет определенного значения. Undefined - это специальное значение, которое будет значением по умолчанию для неназначенных переменных.


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);


1
Было бы полезно показывать встроенные выходные данные каждого предупреждения.
Демискс

@demisx Согласен, но вместо того, чтобы предложить редактирование, почему бы просто не сделать это? Вариант есть по причине. Некоторые могут считать это грубым; Я считаю это эффективным - поэтому отредактировал ответ сам (в ожидании обзора).
Фред Гандт

1
@Fred - я посмотрел историю изменений и могу догадаться, почему ваши изменения были отклонены ... вместо того, чтобы просто добавлять строки, чтобы показать, какими будут результаты, как предложил demisx, вы значительно изменили то, что опубликовал Jith.
Стивен П,

8

Нулевое значение в JavaScript и typeof nullвозвращает"object"

Поэтому принятый ответ не будет работать, если вы передадите нулевые значения. Если вы передаете нулевые значения, вам нужно добавить дополнительную проверку для нулевых значений:

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}

7

Самая надежная проверка 'это определено' с typeof

if (typeof elem === 'undefined')

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

elem = elem || defaultElem;

Это часто хорошо использовать, см .: Идиоматический способ установить значение по умолчанию в JavaScript

Есть также этот вкладыш, использующий ключевое слово typeof :

elem = (typeof elem === 'undefined') ? defaultElem : elem;

7

Вы можете использовать typeofоператор.

Например,

var dataSet;

alert("Variable dataSet is : " + typeof dataSet);

Вышеупомянутый фрагмент кода вернет вывод как

Переменная dataSet: неопределенная.


1
Heads-up: ваш ответ перенесен сюда из stackoverflow.com/questions/519145/…
Shog9

7

Чтобы проверить, была ли переменная объявлена ​​/ установлена, я сделал этот подвох.

Я не нашел способ извлечь код в функцию, даже с eval.

"use strict";

// var someVar;

var declared;
try {
  someVar;
  declared = true;
} catch(e) {
  declared = false;
}

if (declared) {
  console.log("someVar is declared; now has the value: " + someVar);
} else {
  console.log("someVar is not declared");
}

Что вы подразумеваете под «извлекать код в функцию»?
Мелаб

7

Эти ответы (кроме решения Фреда Гандта) являются либо неправильными, либо неполными.

Предположим, мне нужно, variableName;чтобы my имел undefinedзначение, и поэтому оно было объявлено таким образом, var variableName;что означает, что оно уже инициализировано ; - Как я могу проверить, если он уже объявлен?

Или еще лучше - как я могу сразу проверить, существует ли «Book1.chapter22.paragraph37» при одном вызове, но не вызвать ошибку ссылки?

Мы делаем это, используя самый мощный оператор JasvaScript, оператор in . :

"[variable||property]" in [context||root] 
>> true||false

Во времена пиковой популярности AJAX я написал метод (позже названный) isNS (), который способен определить, существует ли пространство имен, включая глубокие тесты для имен свойств, такие как «Book1.chapter22.paragraph37» и многое другое.

Но так как он был ранее опубликован и из-за его большой важности он заслуживает публикации в отдельном потоке, я не буду публиковать его здесь, но предоставлю ключевые слова ( javascript + isNS ), которые помогут вам найти исходный код, поддержанный всеми необходимые объяснения.


1
inОператор проверяет только наличие собственности, а не все переменные свойства - constи letдекларация не является (и constне являются даже, ну, переменными ).
атп

1
constи letбыли стандартизированы с ECMAScript 2015, который был опубликован более 3 лет назад и с тех пор был хорошо принят обычными подозреваемыми и сегодня используется довольно широко, смею сказать, - на Github существует более 2 миллионов случаев «const» в файлах JS .
атп

Да, «переменная» - точно. Вот почему я прокомментировал ваш ответ, указав, что вы не можете использовать inоператор для общего тестирования, существует ли переменная , потому что «const и let не являются [свойствами]» - хотя на constсамом деле можно сказать, что он вводит постоянную ссылку, так как отличие от переменной ссылки, letс другой стороны, на самом деле ввести переменную ссылку - это, другими словами, любая мера, переменной и ваш ответ неверен в это означает , что вы можете проверить , является ли переменная определяется letсуществует с помощью inоператора - вы не можете.
атп

Спецификация ECMAScript 6 определяет язык JavaScript, а не вас или веб-браузер. Вот почему он называется спецификацией - он однозначно определяет язык. Ваш ответ в лучшем случае устарел, в худшем - намеренно опускает то, что вы считаете неуместным, хотя он очень важен. Цитируя связанную спецификацию, «объявления let и const определяют переменные». Эти конструкции недоступны как свойства windowобъекта, я не знаю, как вам это объяснить.
атп

Ответ не охватывает все случаи переменных. В частности, он не охватывает переменные, определенные с помощью letключевого слова. Это все, на что я указывал.
атп

6

В конкретной ситуации, изложенной в вопросе,

typeof window.console === "undefined"

идентично

window.console === undefined

Я предпочитаю последнее, так как оно короче.

Обратите внимание, что мы ищем consoleтолько в глобальной области (которая является windowобъектом во всех браузерах). В этой конкретной ситуации это желательно. Мы не хотим consoleопределяться в другом месте.

@BrianKelley в своем великолепном ответе объясняет технические детали. Я только добавил недостающее заключение и переварил его во что-то более простое для чтения.


Heads-up: ваш ответ перенесен сюда из stackoverflow.com/questions/519145/…
Shog9

2
Ложь. последний выбрасывает исключение в моей консоли.
Джон Ктехик

6

Я использую два разных способа в зависимости от объекта.

if( !variable ){
  // variable is either
  // 1. '';
  // 2. 0;
  // 3. undefined;
  // 4. null;
  // 5. false;
}

Иногда я не хочу оценивать пустую строку как Falsey, поэтому я использую этот случай

function invalid( item ){
  return (item === undefined || item === null);
}

if( invalid( variable )){
  // only here if null or undefined;
}

Если вам нужно обратное, то в первом случае переменная становится переменной !!, а в недопустимой функции === становится! =, А имена функций изменяются на notInvalid.


5

Мое предпочтение typeof(elem) != 'undefined' && elem != null.

Как бы вы ни выбрали, подумайте над тем, чтобы поставить проверку в такую ​​функцию

function existy (x) {
    return typeof (x) != 'undefined' && x != null;
}

Если вы не знаете, объявлена ​​ли переменная, продолжайте с typeof (x) != 'undefined' && x != null;

Если вы знаете, что переменная объявлена, но может не существовать, вы можете использовать

existy(elem) && doSomething(elem);

Переменная, которую вы проверяете, иногда может быть вложенным свойством. Вы можете использовать опору || {}, чтобы пройти строку, проверяющую существование рассматриваемого свойства:

var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;

После каждого свойства используйте (... '|| {}'). NextProp, чтобы отсутствующее свойство не выдавало ошибку.

Или вы можете использовать существующий как existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)


Если вы поместите это в функцию, это излишне. typeof (x) != 'undefined' && x != nullэквивалентно тому, x != nullкогда xобъявлено.
Ry-

3

Это зависит от ситуации. Если вы проверяете что-то, что может или не может быть определено глобально вне вашего кода (например, jQuery), вы хотите:

if (typeof(jQuery) != "undefined")

(Нет необходимости в строгом равенстве, typeof всегда возвращает строку.) Но если у вас есть аргументы для функции, которые могут или не могли быть переданы, они всегда будут определены, но будут пустыми, если опущены.

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"

3

Попробуйте поймать

Если переменная вообще не была определена, вы можете проверить это без выполнения кода разрыва, используя блок try-catch следующим образом (вам не нужно use strictпереключаться в режим)

БОНУС: (ссылаясь на другие ответы) Почему ===это более понятно, чем ==( источник )

если (а == б)

Введите описание изображения здесь

если (а === б)

Введите описание изображения здесь


1
К вашему сведению, (a == b) размещенный на сетке Game of Life был не таким уж захватывающим.
Johnsnails

1

Я удивлен, что это еще не было упомянуто ...

вот несколько дополнительных вариантов, использующих this['var_name']

Преимущество использования этого метода в том, что его можно использовать до определения переменной.

if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part

// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!

Это не верно. window.bar=undefinedопределяется и устанавливается значение. Ваш ответ не может обнаружить разницу между этим и, если переменная не существует. Если бы ты this.hasOwnProperty('bar')это сделал, это могло бы сработать.
oligofren

0

Вы можете использовать блок try ... catch следующим образом:

Недостатком является то, что вы не можете поместить его в функцию, так как это вызовет ReferenceError.

function variableExists(x) {
  var status = true
  try {
	  x
  } catch (ReferenceError) {
	  status = false
  }
  
  return status
}

console.log(variableExists(x))

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.