JavaScript проверяет, существует ли переменная (определена / инициализирована) - PullRequest
1539 голосов
/ 25 февраля 2011

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

if (elem) { // or !elem

или

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

или

if (elem != null) {

Ответы [ 24 ]

4 голосов
/ 13 декабря 2015

Мои предпочтения 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)

4 голосов
/ 25 февраля 2011

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

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

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

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"
2 голосов
/ 27 марта 2019

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

вот несколько дополнительных вариантов, использующих 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!
1 голос
/ 05 апреля 2016

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

Я не нашел способа извлечь код из функции, даже с 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");
}
...