丑陋、讨厌、可怕的方法是使用eval
or 或try..catch
. 一种更强大的方法是使用typeof
:
if (typeof foo != 'undefined' && foo !== Null &&
typeof foo.bar != 'undefined' && foo.bar !== Null &&
...
) {
// stuff
}
但是,只有当最终属性的值不是时才有效undefined
(即,如果属性存在但具有未定义的值,它将失败)。
您可以创建更准确的通用属性测试器来测试自己的属性:
function testChain(obj) {
for (var i=1, iLen=arguments.length; i<iLen; i++) {
if (obj.hasOwnProperty(arguments[i])) {
obj = obj[arguments[i]];
} else {
return false;
}
}
return true;
}
alert( testChain({a:{b:'b'}}, 'a', 'b') ); // true
但这不会检查继承的属性。要检查这些,您可以使用propertyIsEnumerable
,但这不会检查不可枚举的属性(例如,内置对象的本机方法)。
所以真的没有通用的解决方案,你只能针对特定情况定制一个。