4

我只想在对象的子数组中有元素时才显示一些内容。但有时对象本身没有定义,所以如果范围内objectobject.child不存在,这样做会失败:

if(object.child.length){
    alert('hello world');
}

结果是:

Uncaught ReferenceError: object is not defined

所以我必须添加两个额外的 if 条件来检查对象及其子对象是否已定义:

if(typeof object !== 'undefined'){
    if(typeof object.child !== 'undefined'){
        if(object.child.length){
            alert('hello world');
        }
    }
}

围绕这个写一个函数也是有问题的:

function isset(value){ ... }
if(isset(object.child.length)({ ... } // <-- still raises error that object is not defined

有没有更清洁、更短的方法来做到这一点?

4

1 回答 1

10

你可以把警卫放在:

if(object && object.child && object.child.length){

上述防御objectobject.child存在undefinednull(或任何其他虚假值);它之所以有效,是因为所有非null对象引用都是真实的,因此您可以避免冗长的typeof object !== "undefined"形式。你可能不需要上面的两个守卫,如果你确定它object.child会存在的话object。但是两者兼有是无害的。

值得注意的是,即使在检索值时这也很有用,而不仅仅是为了测试它们。例如,假设您有(或可能没有!)object.foo,其中包含您要使用的值。

var f = object && object.foo;

如果object是假的(undefined或是null典型情况),那么f将收到该假值(undefinednull)。如果object为真,f将收到 的值object.foo

||奇怪地以类似的方式强大。

于 2013-09-20T12:57:34.740 回答