【问题标题】: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)...
  • 你会得到这个问题的很多答案,我认为其中大部分都是正确的......我投票赞成这个问题,因为很高兴看到错误处理的“正确”尝试......

标签: javascript jquery variables


【解决方案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 呢?为什么这还不够?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2014-02-17
    • 2014-01-20
    • 1970-01-01
    • 2011-06-03
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多