2012-12-19 76 views
47

Possible Duplicate:
How can I check whether a variable is defined in JavaScript?
Is there a standard function to check for null, undefined, or blank variables in JavaScript?JQuery/Javascript:检查是否存在var

我有一个脚本发生在两个部分。

第一部分建立一个变种:

var pagetype = "textpage"; 

第二部分是一个简单的if语句:

if(pagetype == "textpage") { 
//do something 
}; 

现在的第二部分,if语句,出现在所有页面我现场。但是,声明var的第一部分只出现在我的一些页面上。

在页面上没有VAR我自然得到这个错误:

Uncaught ReferenceError: pagetype is not defined 

所以我的问题是:是否有JavaScript或JQ的路要走,如果一个变种存在于所有检测(不只是如果有分配给它的数据)?

我想象如果statment我只想用另一个,如:

if ("a var called pagetypes exists").... 
+1

'typeof',','大部分window.hasOwnProperty'如果(VAR X)'... –

+1

你会得到很多回答这个问题,我认为这将是正确的...我投了这个问题,因为它很高兴看到一个'正确的'尝试在错误处理... – Zak

回答

92

我怀疑有很多答案,这样对左右,但在这里你去:

if (typeof pagetype !== 'undefined' && pagetype == 'textpage') { 
    ... 
} 
+0

if(var pagetype ==“textpage”)...''? –

+10

@JanDvorak:可以肯定,这是无效的JS ... – elclanrs

+2

这并不测试是否已经声明'pagetype',只是它的值的类型不是未定义的。 – RobG

16

您可以使用typeof

if (typeof pagetype === 'undefined') { 
    // pagetype doesn't exist 
} 
4

为了测试存在,有两种方法。

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 
+1

只有在全局范围内定义'pagetype'时才可以使用 –

+2

这也适用于浏览器,但不适用于Node.js。尝试使用'this'而不是'window'。 –

+0

@ Bruno-你的方法a不检查变量的存在,方法b只对全局属性有用,其中一些可能是变量。 – RobG

2

每个条件语句在测试之前,你可以做这样的事情:

var pagetype = pagetype || false; 
if (pagetype === 'something') { 
    //do stuff 
} 
+0

假设您不介意将'pagetype'定义为OFC的副作用。 –

+0

这只是一种方法。这样,如果不存在条件,它至少会默认失败。 – Jason

+0

对于'pagetype'这样的'''''''',''''''等''''''''''''''''''''如果'pagetype'已经被声明并且被设置为这些值之一,那么''false'并会导致不正确的比较。 – Ian

3

这是不可能确定一个变量是否已经被声明或者没有被使用,除非使用try..catch导致一个错误,如果它没有被声明的话。测试,如:

if (typeof varName == 'undefined') 

不告诉你,如果varName的范围是一个变量,只用typeof该测试返回undefined。例如

var foo; 
typeof foo == 'undefined'; // true 
typeof bar == 'undefined'; // true 

在上面,你不能说foo被宣布,但bar不是。您可以测试使用in全局变量:

var global = this; 
... 
'bar' in global; // false 

但全球的对象是唯一的变量对象*您可以访问,你不能访问任何其他执行上下文的变量对象。

解决方法是始终在合适的上下文中声明变量。

  • 全局对象并不是一个真正的变量对象,它只是具有匹配全局变量的属性并提供对它们的访问,所以它看起来只是一个。
+1

另一种情况是drive-by down选民谁不能解释为什么。 – RobG

8

对于您的情况以及所有其他人的99.9%elclanrs答案是正确的。

但由于undefined是一个有效的值,如果有人来测试未初始化的变量

var pagetype; //== undefined 
if (typeof pagetype === 'undefined') //true 

唯一的100%可靠的方法来确定是否存在变量被捕获异常;

var exists = false; 
try { pagetype; exists = true;} catch(e) {} 
if (exists && ...) {} 

但我绝不会写这样

+1

如果你downvote,证明答案错了 – jermel

+0

^^ if(typeof pagetype ==='undefined')// false' – elclanrs

+1

叹...错别字:-),即使它仍然是真实的 – jermel