我想检查一下,如果仍然声明了扩展的对象。
我的一般对象是:
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?
答案 0 :(得分:1)
窗口上的属性为test
。 引用的对象具有名为hello
的属性。
所以你可以做你正在谈论的事情:
if ('test' in window && 'hello' in test){ console.log("test.hello shout be there!"); };
如果test
或hello
无法 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
,""
,NaN
,null
,undefined
,当然还有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");
}