Javascript 如何检查属性是否包含属性

Javascript 如何检查属性是否包含属性,javascript,properties,conditional-statements,Javascript,Properties,Conditional Statements,我需要检查属性是否包含属性,现在我使用的是示例中的if语句 下面是一个示例对象 var Foo = { "bar" : { "foobar": { "barfoo":1 } } } 我需要检查barfoo是否存在,但首先我需要检查所有其他属性是否存在,因为它们可能不取决于是否运行了另一个函数。我也不能真正降低这个结构的级别,所

我需要检查属性是否包含属性,现在我使用的是示例中的if语句

下面是一个示例对象

var Foo = {
    "bar" : 
        {
            "foobar":
                {
                    "barfoo":1
                }
        }
}
我需要检查barfoo是否存在,但首先我需要检查所有其他属性是否存在,因为它们可能不取决于是否运行了另一个函数。我也不能真正降低这个结构的级别,所以这不是一个选项

目前我正在做类似的事情:

var d = Foo;
if (d) {
    d = d.bar;
    if (d) {
        d = d.foobar;
        if (d) {
            d = d.barfoo;
            if(d){
                console.log(d);
            }
        }
    }
}

您可以在一个if语句中完成这一切:

if (d && d.bar && d.bar.foobar && d.bar.foobar.barfoo)
var barfoo;
try{
  barfoo = d.bar.foobar.barfoo
}
catch(e){
  barfoo = null;
}
这是因为javascript在任何元素失败时都会停止检查if语句,因此不会出现类似undefined的cannotcheck属性的错误

否则,可以使用try-catch语句:

if (d && d.bar && d.bar.foobar && d.bar.foobar.barfoo)
var barfoo;
try{
  barfoo = d.bar.foobar.barfoo
}
catch(e){
  barfoo = null;
}

您只需使用&-,执行一个if语句,该语句执行短路计算

if (d
    && d.hasOwnProperty('bar')
    && d.bar.hasOwnProperty('foobar')
    && d.bar.foobar.hasOwnProperty('barfoo')
) {
    // fancy things happen
}

使用d.hasOwnProperty'bar而不仅仅是d.bar的原因是为了防止对象原型受到污染。

如果您只需要知道它是否存在,只需尝试一下即可

试一试{

}卡克斯{

     //you know it's no good/doesn't exist
}


更稳健的解决方案:检查对象的任何深度

var Foo = {
    "bar": {
        "foobar": {
            "barfoo": {
                "ddd": 1
            }
        }
    }
};

function checkProps(obj) {
    var ref = obj, arg, i;
    for (i = 1; i < arguments.length; i += 1) {
        arg = arguments[i];
        if(ref.hasOwnProperty(arg)){
            ref = ref[arg]
        } else {
            return false;
        }
    }
    return true;
}
//the function takes the object to search as first parameter and any other properties [,prop1,prop2,...]
console.log(checkProps(Foo, 'bar', 'foobar', 'barfoo', 'ddd'));

为什么我没有想到那个O.O有时我甚至都不想。谢谢这是对另一个答案的评论吗?对不起。单次调用似乎更好。你说我也不能真正降低这种结构的级别是什么意思,所以这不是一种选择?如果你绝对需要嵌套的条件,那么你做得很好。+1我想建议类似的东西,但是传递一个带有目标路径的字符串,比如bar.foobar.barfoo.ddd,然后拆分它并循环。另外,它的一个变体可能会返回目标属性的值,或者如果未找到未定义的,则返回未定义的值,因为当您尝试在单个级别上读取不存在的属性时,会得到未定义的值。如果ref==0,会发生什么情况?这意味着它将返回FALSWALL&&ref!==解决这个问题?很好的解决方案。不过我会做一点小小的改变。Object.prototype.checkProps=函数{},并将obj更改为此。然后你就可以做:Foo.checkProps'bar'、'foobar'、'barfoo'、'ddd'@检查的智能柠檬!==0是不够的,它仍然会为null、undefined和false本身返回false。如果检查继承的属性,会更安全,但显然不起作用。有效,但可能会影响性能,特别是在多次使用时。