JQuery / Javascript:检查var是不是存在[重复]

Posted

技术标签:

【中文标题】JQuery / Javascript:检查var是不是存在[重复]【英文标题】:JQuery/Javascript: check if var exists [duplicate]JQuery / Javascript:检查var是否存在[重复] 【发布时间】:2012-12-06 07:35:18 【问题描述】:

可能重复: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?

我有一个分为两部分的脚本。

第一部分设置一个var:

var pagetype = "textpage";

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

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

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

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

Uncaught ReferenceError: pagetype is not defined

所以我的问题是:有没有办法用 JavaScript 或 JQ 来检测一个 var 是否存在(不仅仅是它是否有数据分配给它)?

我想我会使用另一个 if 语句,例如:

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

【问题讨论】:

typeof, window.hasOwnProperty, if(var x)... 你会得到这个问题的很多答案,我认为其中大部分都是正确的......我投票赞成这个问题,因为很高兴看到错误处理的“正确”尝试...... 【参考方案1】:

我怀疑在 SO 上有很多这样的答案,但你去吧:

if ( typeof pagetype !== 'undefined' && pagetype == 'textpage' ) 
  ...

【讨论】:

if(var pagetype == "textpage")... 呢? @JanDvorak:很确定那不是有效的 JS... 这并不测试pagetype是否被声明,只是它的值的类型不是未定义的。 该问题专门要求进行测试,即即使尚未分配变量,也已声明变量。因此,即使只声明了 var pagetype; 而没有为其赋值,if 语句也应该返回 true。目前没有。 @elclanrs 如果在我的脚本顶部我声明变量 pagetype 像这样var pagetype; 以下表达式将返回typeof pagetype? var 存在,但没有分配给它的值。因此,typeof pagetype 不能用作存在的测试。【参考方案2】:

你可以使用typeof:

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

【讨论】:

【参考方案3】:

要测试是否存在,有两种方法。

一个。 "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

【讨论】:

这仅在pagetype 定义在全局范围内时有效 这也仅适用于浏览器,但不适用于 Node.js 等。尝试使用this 而不是window @Bruno——你的方法 a 不检查变量是否存在,方法 b 只对全局属性有用,其中一些可能是变量。 全局变量不是添加到全局对象的用户定义属性吗?但是是的,你是对的。 @Bruno 如果你在函数内部声明一个变量会怎样。这不会将它添加到全局对象中......【参考方案4】:

在每个条件语句之前,您可以执行以下操作:

var pagetype = pagetype || false;
if (pagetype === 'something') 
    //do stuff

【讨论】:

假设您不介意将 pagetype 定义为副作用,OFC。 这只是一种方法。这样,如果条件不存在,它至少会默认失败。 这对于 pagetype 具有错误值(如 ""0 等)根本不起作用。如果 pagetype 已声明并设置为这些值之一,则覆盖false,会导致不正确的比较。 实际上不会。如果您希望条件与特定字符串不匹配(如 OP 的情况)失败,那么当然 ""0false 都是等价的【参考方案5】:

除了使用 try..catch 来判断一个变量是否被声明是不可能的。测试如下:

if (typeof varName == 'undefined') 

不要告诉你varName 是否是范围内的变量,只有使用 typeof 的测试返回未定义。例如

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

在上面,你不能说 foo 被声明但 bar 没有被声明。您可以使用in 测试全局变量:

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

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

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

全局对象并不是真正的变量对象,它只是具有与全局变量匹配并提供对它们的访问权限的属性,因此它看起来就是一个。

【讨论】:

又一例无法解释原因的驾车通过的选民。【参考方案6】:

对于你的情况,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 && ...) 

但我永远不会这样写

【讨论】:

如果你投反对票,证明答案是错误的 ^^if (typeof pagetype === 'undefined') //false sigh ... 错字:-),即使它仍然评估为 true 其实你就在那里。我会尽可能投票。 'prop' in this 呢?为什么这还不够?

以上是关于JQuery / Javascript:检查var是不是存在[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 var 是不是是 JavaScript 中的字符串?

javascript Var Type检查器(toType)

jQuery“ $ variable”与javascript“ var” 简单变量声明的困惑

Javascript/Jquery-如何检查函数是不是返回任何值?

javascript & jQuery

原生javascript 实现jQuery代码效果对比