如何检查对象是否仍在窗口中

时间:2014-08-17 08:41:25

标签: javascript object

我想检查一下,如果仍然声明了扩展的对象。

我的一般对象是:

var test = test || {};

这很好用:

if (('test' in window)){ console.log("test is there!");  };

但如果我展开它......

test.hello = "Is this in window?";

以下检查没有结果。

if (('test.hello' in window)){ console.log("test.hello shout be there!");  };

如何判断是否声明了test.hello?

2 个答案:

答案 0 :(得分:1)

窗口上的属性为test。 引用的对象具有名为hello的属性。

所以你可以做你正在谈论的事情:

if ('test' in window && 'hello' in test){ console.log("test.hello shout be there!");  };

如果testhello无法 falsey ,则可以更有效地执行此操作(in有点慢,虽然你不得不在一个循环中这样做数百万次,而且不那么笨拙:

if (window.test && test.hello){ console.log("test.hello shout be there!");  };
// or
if (window.test && window.test.hello){ console.log("test.hello shout be there!");  };

...但同样,只有在hello无法判断时才有效(我们知道test不是假的,它是非空对象参考)。假名值为0""NaNnullundefined,当然还有false


根据您的评论:

  

但我如何运行:var testing =" test.hello&#34 ;; window [testing] = window [testing]&& console.log("在那里测试")

为此,您必须在.上拆分字符串,然后检查循环。功能可能是最好的:

function check(obj, str) {
    return str.split(".").every(function(part) {
        if (part in obj) {
            // The current object has the current part, grab the
            // thing it refers to for use in the next loop
            obj = obj[part];
            return true;
        }
        return false;
    });
}

使用ES5的Array#every功能,该功能可在ES5前引擎上进行调整。 check函数适用于任意深度,而不仅仅是两个级别。

完整示例:Live Copy

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title>Example</title>
</head>
<body>
<script>
  (function() {
    "use strict";

    window.test = {hello: "testing"};

    display("Should be true: " + check(window, "test.hello"));
    display("Should be false: " + check(window, "foo.hello"));
    display("Should be false: " + check(window, "test.foo"));

    window.foo = {
      bar: {
        baz: {
          test: "foo.bar.baz.test"
        }
      }
    };

    display("Should be true: " + check(window, "foo.bar.baz.test"));

    function check(obj, str) {
        return str.split(".").every(function(part) {
            if (part in obj) {
                obj = obj[part];
                return true;
            }
            return false;
        });
    }

    function display(msg) {
      var p = document.createElement('p');
      p.innerHTML = String(msg);
      document.body.appendChild(p);
    }
  })();
</script>
</body>
</html>

答案 1 :(得分:0)

var test =  test || {};
test.hello = "Is this in window?";
if ((test.hello)){ console.log("test.hello shout be there!");  }else{
console.log("boo");
}