【问题标题】:JavaScript: Check to see if a variable or object existsJavaScript:检查变量或对象是否存在
【发布时间】:2013-09-19 17:58:26
【问题描述】:

如果设置了变量/对象,我有一个函数可以返回:

function isset() {
    var a = arguments, l = a.length;
    if (l === 0) { console.log("Error: isset() is empty"); }
    for (var i=0; i<l; i++) {
        try {
            if (typeof a[i] === "object") {
                var j=0;
                for (var obj in a[i]) { j++; }
                if (j>0) { return true; }
                else { return false; }
            }
            else if (a[i] === undefined || a[i] === null) { return false; }
        }
        catch(e) {
            if (e.name === "ReferenceError") { return false; }
        }
    }
    return true;
}

例如,这是有效的:

var foo;
isset(foo);        // Returns false
foo = "bar";
isset(foo);        // Returns true
foo = {};
isset(foo);        // Returns false
isset(foo.bar);    // Returns false
foo = { bar: "test" };
isset(foo);        // Returns true
isset(foo.bar);    // Returns true

这就是问题所在...如果 foo 从未设置为开头,则会发生这种情况:

// foo has not been defined yet
isset(foo); // Returns "ReferenceError: foo is not defined"

我认为如果 error.name === "ReferenceError" 但它不起作用,我可以使用 try/catch/finally 返回 false。我哪里错了?


编辑:

所以下面的答案是正确的。正如我所料,您无法访问未定义的变量或使用 try/catch/finally 捕获它(请参阅下面的说明)。

但是,这是一个不太优雅的解决方案。您必须在引号中传递变量的名称,然后使用 eval 进行检查。这很丑,但它有效:

// Usage: isset("foo"); // Returns true or false
function isset(a) {
    if (a) {
        if (eval("!!window."+a)) {
            if (eval("typeof "+a+" === 'object'")) { return eval("Object.keys("+a+").length > 0") ? true : false; }
            return (eval(a+" === undefined") || eval(a+" === null") || eval(a+" === ''")) ? false : true;
        }
        else { return false; }
    }
    else { console.log("Empty value: isset()"); }
}

为了进一步跟进,我清理了最顶部的原始函数。它仍然有同样的问题,如果变量不存在你会得到一个 ReferenceError,但这个版本更干净:

// Usage: isset(foo); // Returns true or false if the variable exists.
function isset(a) {
    if (a) {
        if (typeof a === "object") { return Object.keys(a).length > 0 ? true : false; }
        return (a === undefined || a === null || a === "") ? false : true;
    }
    else { console.log("Empty value: isset()"); }
}

【问题讨论】:

  • 我假设foo 是一个全局变量。 window.foo 会起作用。
  • 这不是 PHP。 JavaScript 的工作方式有些不同......虽然您可以为未初始化的变量赋值,但您实际上不能使用未初始化的值。如果未定义 barfoo = bar + 2 将不起作用。 foo = 2 会起作用,除非在严格模式下。

标签: javascript referenceerror


【解决方案1】:

你不能用函数做那种类型的检查。为了传递变量,它需要存在,所以它会在你的代码运行之前失败。

当您在未声明的变量上调用它时,您是在尝试解析参数位置中标识符的值。

//     v----resolve identifier so it can be passed, but resolution fails
isset(foo);

当然,它不存在,所以 ReferenceError 被抛出。

JavaScript 没有指针,所以没有什么像 nil 指针这样可以代替它传递的。

【讨论】:

    【解决方案2】:

    您不能传递尚未初始化的标识符。您可以传递一个字符串和一个要测试的对象,如下所示:

    function isset(str, obj) {
      return obj[str] ? true : false;
    }
    
    isset("foo", window); // >>> false
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 2020-06-18
      • 2014-01-20
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      相关资源
      最近更新 更多