Javascript 为对象的未定义属性搜索比折叠if语句更好的解决方案

Javascript 为对象的未定义属性搜索比折叠if语句更好的解决方案,javascript,object,if-statement,undefined,Javascript,Object,If Statement,Undefined,这是关于if语句的一个非常基本的问题。它不一定只影响javascript 如果object.user是未定义的这将中断: if ( object.user.name ) { sayMyName(); } else { object.user = {}; object.user.name = 'Jane Doe'; sayMyName(); } 因为它无法读取未定义的属性。所以我把else放在一个函数中,把if折叠成另一个if: function anonymous(object

这是关于if语句的一个非常基本的问题。它不一定只影响javascript

如果
object.user
未定义的
这将中断:

if ( object.user.name ) {
  sayMyName();
} else {
  object.user = {};
  object.user.name = 'Jane Doe';
  sayMyName();
}
因为它无法读取未定义的属性。所以我把else放在一个函数中,把if折叠成另一个if:

function anonymous(object) {
  object.user = {};
  object.user.name = 'Jane Doe';
  sayMyName();
}

if ( object.user ) {
  if ( object.user.name ) {
    sayMyName();
  } else {
    anonymous();
  }
} else {
  anonymous();
}
但对我来说,这似乎是个糟糕的代码。这种情况一定是个常见问题。或者至少我经常这样。有什么好的解决办法吗

编辑:

@李东杰先生的建议

if(object && object.user && object.user.name){...}

是更好的方法,但这似乎不是最好的解决方案。设想一个if语句试图获取obj.some.very.very.deep.property。我目前正在尝试编写一个助手函数,如
checkPropertySafley(object.user.name)返回到
对象
,并递归检查每个属性,不管它有多深。因此,基本上,我尝试自动化@Mritunjay的手动编写语句。

在这种情况下,我使用bellow

if(object.user && object.user.name){...}
顺便说一句,您应该检查
对象是否也存在

if(object && object.user && object.user.name){...}

我终于想出了如何编写helper函数。这是:

function propertyExists(property) {
    var statement = '';
    var prevItem = '';

    property.split(".").forEach(function(item, index) {
        if (index != 0) {statement += ' && '}
        statement += prevItem+item;
        prevItem += item+'.';
    });

    return eval(statement);
}
使用此功能,我现在可以简单地执行以下操作:

if ( propertyExists('object.user.name') ) {
  sayMyName();
} else {
  anonymous();
}

我真丢脸!我以为那不行。也许是因为我没有听从命令。但是我想知道是否有一种更短的方法可以做到这一点。
obj.some.very.very.deep.property
不应该发生。函数应该使用它需要的东西。如果它需要
deep
,那么就给它
deep
,而不是
obj
。看,我不认为它是非常有用的,直到我检查到许多级别,如
a.b.c.d.e.f……
,在这种情况下,它似乎是一个糟糕的设计。