Javascript 为对象的未定义属性搜索比折叠if语句更好的解决方案
这是关于if语句的一个非常基本的问题。它不一定只影响javascript 如果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
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……
,在这种情况下,它似乎是一个糟糕的设计。