这是关于if语句的一个非常基本的问题。它不一定只影响javascript。
如果object.user
为undefined
,则会中断:
if ( object.user.name ) {
sayMyName();
} else {
object.user = {};
object.user.name = 'Jane Doe';
sayMyName();
}
因为它无法读取未定义的属性。所以我将其他东西放在一个函数中并将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();
}
但这对我来说看起来很糟糕。这种情况一定是个常见问题。或者至少我经常这样做。对此有什么好的解决方案吗?
编辑:
@Mritunjay的提议
if(object && object.user && object.user.name){...}
更好,但它似乎不是最好的解决方案。想象一下试图获得obj.some.very.very.deep.property
的if语句。我正在尝试编写一个像checkPropertySafely(object.user.name);
这样的辅助函数,它返回object
,并且无论它有多深,都会递归检查每个属性。所以基本上我尝试自动化@Mritunjay的手工书面声明。
答案 0 :(得分:2)
我在这种情况下使用bellow
if(object.user && object.user.name){...}
顺便说一句,你应该检查object
是否也存在。
if(object && object.user && object.user.name){...}
答案 1 :(得分:0)
我终于想出了如何编写辅助函数。这是:
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();
}