JQuery / Javascript: проверьте, существует ли var [дубликат]
Возможные Дубликаты:
как я могу проверить, определена ли переменная в JavaScript?
есть ли стандартная функция для проверки на null, undefined или пустые переменные в JavaScript?
у меня есть сценарий, который происходит в двух частях.
первая часть устанавливает var:
var pagetype = "textpage";
вторая часть-это простое утверждение if:
if(pagetype == "textpage") {
//do something
};
теперь 2-я часть, оператор if, появляется на всех страницы моего сайта. Но первая часть, где объявлен var, появляется только на некоторых моих страницах.
на страницах без var я естественно получаю эту ошибку:
Uncaught ReferenceError: pagetype is not defined
Итак, мой вопрос: есть ли способ с помощью JavaScript или JQ определить, существует ли var вообще (а не только если ему назначены данные)?
Я представляю, что я бы просто использовал другое утверждение if, например:
if ("a var called pagetypes exists")....
6 ответов:
Я подозреваю, что есть много ответов, как это на так, но здесь вы идете:
if ( typeof pagetype !== 'undefined' && pagetype == 'textpage' ) { ... }
для вашего случая, и 99,9% всех остальных
elclanrs
ответ правильный.а потому что
undefined
является допустимым значением, если кто-то должен был проверить неинициализированную переменнуюvar pagetype; //== undefined if (typeof pagetype === 'undefined') //true
единственный 100% надежный способ определить, существует ли var, - это поймать исключение;
var exists = false; try { pagetype; exists = true;} catch(e) {} if (exists && ...) {}
но я бы никогда не написать так
для проверки на существование существует два метода.
a.
"property" in object
этот метод проверяет цепочку прототипов на наличие свойства.
b.
object.hasOwnProperty( "property" )
этот метод не поднимается по цепочке прототипов, чтобы проверить наличие свойства, оно должно существовать в объекте, на котором вы вызываете метод.
var x; // variable declared in global scope and now exists "x" in window; // true window.hasOwnProperty( "x" ); //true
если бы мы тестировали с помощью следующего выражения, то он вернул бы false
typeof x !== 'undefined'; // false
перед каждым из условных операторов, вы могли бы сделать что-то вроде этого:
var pagetype = pagetype || false; if (pagetype === 'something') { //do stuff }
невозможно определить, была ли объявлена переменная или нет, кроме использования try..поймать, чтобы вызвать ошибку, если она не была объявлена. Тест типа:
if (typeof varName == 'undefined')
не говорите вам, если
varName
- это переменная в области видимости, только что тестирование с помощью оператора typeof возвращает "undefined". например,var foo; typeof foo == 'undefined'; // true typeof bar == 'undefined'; // true
в приведенном выше, вы не можете сказать, что foo был объявлен, но бар не был. Вы можете проверить для глобальных переменных с помощью
in
:var global = this; ... 'bar' in global; // false
но глобальный объект единственный объект переменной* вы можете получить доступ, вы не можете получить доступ к объекту переменной любого другого контекста выполнения.
решение состоит в том, чтобы всегда объявлять переменные в соответствующем контексте.
- глобальный объект на самом деле не является переменным объектом, он просто имеет свойства, соответствующие глобальным переменным и обеспечивающие доступ к ним, поэтому он просто кажется одним.