Как проверить неопределенную переменную в JavaScript

914

Я хотел проверить, определена ли переменная или нет. Например, следующее выдает не определенную ошибку

alert( x );

Как я могу поймать эту ошибку?

Jineesh
источник
5
Похоже, это дедушка: stackoverflow.com/questions/1485840/… stackoverflow.com/questions/2647867/… - возможно, это здорово: stackoverflow.com/questions/27509/…
случайно
1
Это не дубликат помеченного дубликата. Разрешение переменной и разрешение свойства объекта - это очень разные вещи. Лучший дубликат - как проверить, существует ли переменная в javascript? ,
RobG
Ваша ошибка связана с тем, что переменная не была объявлена. Большинство ответов сосредоточены на задании. Смотрите мой ответ для более. Кроме того, многие из них неправильно утверждают, что null и undefined являются объектами в JavaScript. Они примитивы , а не объекты ...
JBallin

Ответы:

1691

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

Во-вторых, нет, прямого эквивалента нет. Если вы действительно хотите проверить, для каких null:

if (yourvar === null) // Does not execute if yourvar is `undefined`

Если вы хотите проверить, существует ли переменная, это можно сделать только с помощью try/ catch, поскольку она typeofбудет обрабатывать необъявленную переменную и переменную, объявленную со значением undefinedкак эквивалентную.

Но, чтобы проверить, объявлена ​​ли переменная и нет ли она undefined:

if (yourvar !== undefined) // Any scope

Ранее необходимо было безопасно использовать typeofоператор для проверки неопределенности, потому что можно было переназначить undefinedкак переменную. Старый способ выглядел так:

if (typeof yourvar !== 'undefined') // Any scope

Вопрос undefinedповторных назначаемый был зафиксирован в ECMAScript 5, который был выпущен в 2009 году Теперь вы можете безопасно использовать ===и !==для тестирования на undefinedбез использования , typeofкак undefinedбыли только для чтения в течение некоторого времени.

Если вы хотите знать, существует ли член независимо, но не волнует его значение:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

Если вы хотите узнать, является ли переменная истинной :

if (yourvar)

Источник

натрий
источник
71
undefined не является зарезервированным словом; Вы (или чужой код) можете выполнить "undefined = 3", и это сломает два ваших теста.
Джейсон С
6
«Если вы знаете, что переменная существует, но не знаете, есть ли в ней какое-либо значение» - а ?!
Джейсон С
36
Я думаю, что он ссылается на объявленную переменную, которая не была назначена. например: var foo; // foo существует, но не имеет значения
Wally Lawless
3
Хммм ... Я только что заметил ссылку "источник": весь этот пост является прямой цитатой из списка рассылки и, вероятно, должен быть отредактирован, чтобы сделать это более ясным, так как оригинальный автор не доступен для уточнения.
Джейсон С
11
«В JavaScript нуль - это объект», это не совсем так, и, вероятно, виновником этого заблуждения является typeofоператор ( typeof null == 'object'). nullЗначение является примитивным значением , которое является единственным значением типа Null .
CMS
347

Единственный способ действительно проверить, является ли переменная, undefinedсостоит в следующем. Помните, что undefined - это объект в JavaScript.

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

Некоторые другие решения в этом потоке приведут вас к мысли, что переменная не определена, даже если она была определена (например, со значением NULL или 0).

Майкл Уэльс
источник
18
Поскольку вопрос был НЕ НЕ УКАЗАН, здесь должен быть typeof someVar! == 'undefined', верно?
eomeroff
1
На самом деле, я не думаю, что undefined является объектом, сначала проверьте документацию developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
14:00
2
Единственный тест, который не дает ReferenceError.
Nostalg.io
2
Этот код правильный, но я думаю, что говорить undefined, что объект в javascript - это дезинформация. Относится ли это утверждение к вашему ответу? Это значение undefinedтипа undefined, присвоенное глобальному идентификатору имени undefined.
SimplGy
1
Это сейчас неправильно с точки зрения того, что это единственный путь. undefinedтолько для чтения с ES5. Вы можете безопасно проверить для использования неопределённых if (x === undefined) {...}или при помощи стенографии , как это: if (x === void 0).
Стивен М Ирвинг
66

Технически, правильным решением является (я считаю):

typeof x === "undefined"

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

x == null

но это позволяет и неопределенной переменной x, и переменной x, содержащей null, возвращать true.

Джейсон С
источник
1
если вы напечатаете, var x;и typeof x;вы получите "undefined"точно так же, как если бы вы это сделалиtypeof lakjdflkdsjflsj;
Мухаммед Умер
Таким образом, нет способа проверить неопределенную, но объявленную переменную?
Мухаммед Умер
1
Я так не думаю; Я не уверен, почему вы хотели бы.
Джейсон С
ujndefined не должен быть между вершинами
LowFieldTheory
что вы подразумеваете под вершинами?
Джейсон С
19

Еще более простая и более краткая версия была бы:

if (!x) {
   //Undefined
}

ИЛИ

if (typeof x !== "undefined") {
    //Do something since x is defined.
}
Дмитрий Фарков
источник
26
первый фрагмент кода может быть неправильным, если x устанавливается из вызова функции. как х = А (); если A ничего не возвращает, он вернет «undefined» по умолчанию. Делать! X было бы верно, что было бы логически правильно. Однако, если A () возвращает 0, тогда! X должен быть ложным при x = 0. Однако в JS! 0 также верно.
Раджат
второй код можно сократить до: if (! typeof (XX)) {...} else {...}
Алехандро Сильва
2
@AlejandroSilva Извините за поздний ответ. Это не сработает, так как typeof возвращает строку, поэтому он вернет 'undefined' для неопределенной переменной, которая, в свою очередь, будет оцениваться как TRUE, что приведет к ложному срабатыванию определенной переменной.
Дмитрий Фарков
5
Пожалуйста, избавьтесь от первого фрагмента, это просто плохо
Хуан Мендес
1
Другие комментарии указывают на то, что первый пример плохой, но не ясно, почему. Итак, для любых новых кодеров:! X не проверяет, определен ли x, но верно ли это. Строки, логическое значение true и положительные числа являются достоверными (и я мог бы забыть некоторые вещи), но другие потенциально допустимые значения, такие как 0, логическое false и пустая строка, не соответствуют действительности. Первый пример может работать для конкретных случаев использования (например, тестирование строки, если вы можете рассматривать пустой так же, как неопределенный), но из-за множества, где это не так, его не следует рассматривать как способ проверки по умолчанию.
Cfc
16

Я часто делал:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}
Джо
источник
9
Попробуйте изменить "==" на "===". Если вы позвоните в doSomething (null), вы также получите предупреждение. Если только это не то, что вы хотите.
Джейсон С
Ага. Вы должны решить, хотите ли вы эквивалент или точно равно. В любом случае может быть полезным.
Джо
1
просто проверьте вот так-> if (typeof variableName! == 'undefined') {alert (variableName);}
Мухаммад Садик
это бесполезно, поскольку вы все равно не сможете передать неопределенную
avalanche1
2
Что вы можете. Попробуйте вызвать функцию без аргумента.
Джо
3

Вы также можете использовать троичный условный оператор:

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

Джон
источник
Что если var a = false;? Вы должны проверить это, если a===undefinedвместо этого
Iter Ator
1
Вопрос: проверьте неопределенную переменную ..... Это неопределенная переменная: var x; выполнение выше приведёт к ошибке
Мухаммед Умер
«Если a = false, тогда будет отображаться« я не знаю «a» »» - вот в чем проблема, вопрос заключается в том, чтобы проверить, определено ли оно, а не истинно ли оно. Если a определено как false, то a не является неопределенным. Это возвращает неправильный результат в этом случае. Смотрите мой комментарий на stackoverflow.com/a/858270/2055492 для более подробной информации о том, почему этот подход не работает.
Cfc
не только будет !aпроверять истину для undefined, он также проверяет истину для 0и nullи false. Это очень неправильно и должно быть удалено.
Стивен М Ирвинг
2

Я часто использую самый простой способ:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

РЕДАКТИРОВАТЬ:

Без инициализации переменной будет выдано исключение "Uncaught ReferenceError: переменная не определена ..."

mokiSRB
источник
2
Uncaught ReferenceError: variable is not defined
Мухаммед Умер
@MuhammadUmer, не так! variableопределяется var variable;. И этот фрагмент будет переопределен variableв локальной области видимости. Это может нарушить логику, которая ожидает доступа к замыканию или глобальной переменной. Т.е.:var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
Евгений Савичев
2

Другим потенциальным «решением» является использование windowобъекта. Это позволяет избежать проблемы ошибки ссылки в браузере.

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}
ubershmekel
источник
Это не решает первоначальный вопрос и совершенно не имеет значения. Плакат не спрашивал, как проверить, является ли что-то правдивым или ложным, он спрашивал, как проверить undefined. Это не будет делать это.
Стивен М Ирвинг
2

Ошибка говорит вам, что xдаже не существует! Он не был объявлен , что отличается от присвоения значения.

var x; // declaration
x = 2; // assignment

Если бы вы заявили x, вы не получите ошибку. Вы получите предупреждение, в котором говорится, undefinedчто xсуществует / было объявлено, но ему не присвоено значение.

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

if(typeof x  !==  "undefined") {
    alert(x);
}

Это проверка типа значения, хранящегося в x. Он вернется только undefinedкогда xне была объявлена или , если он уже был объявлен и еще не был назначен.

JBallin
источник
undefined был доступен только для чтения с ES5 (выпуск 2009), и вам больше не нужен typeofоператор.
Стивен М Ирвинг
2

В voidвозвращаете оператора undefinedдля любого аргумента / выражения , переданного ему. так что вы можете проверить против результата ( на самом деле некоторые minifiers изменить код от undefinedдо , void 0чтобы сэкономить пару символов)

Например:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}
Сварог
источник
Дин Дин! Это правильный ответ. Позор, это все внизу. Все так одержимы тем, что все еще используют, typeofи мышление undefinedможет быть переназначено, что было невозможно в течение десятилетия.
Стивен М Ирвинг
Это было также безопасно до ES5, потому что тогда, даже если вы переназначили undefined, потому что Бог знает только, по какой причине использование void 0всегда вернется undefinedнезависимо.
Стивен М Ирвинг
1

Мы можем проверить undefinedследующим образом

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}
Аршид К.В.
источник
1

Просто сделайте что-то вроде ниже:

function isNotDefined(value) {
  return typeof value === "undefined";
}

и назовите это как:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false
Алиреза
источник
0

Принятый ответ правильный. Просто хотел добавить еще один вариант. Вы также можете использовать try ... catchблок для обработки этой ситуации. Причудливый пример:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

Помните о catchблоке, который немного запутан, поскольку создает область уровня блока. И, конечно, пример чрезвычайно упрощен, чтобы ответить на заданный вопрос, он не охватывает лучшие практики обработки ошибок;).

Евгений Савичев
источник
0

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

Не создан - var my_variable;Создан -var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

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

if ( varExists(variable_name) ) { // checks that it DOES exist } 

или проверить, что оно не было определено и не было использовано ...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }
MistyDawn
источник
1
Почему бы не вернуть свой предикат сразу? return typeof el !== "undefined" && typeof el.val() !== "undefined"
skubski