如何推荐地检查对象属性(例如obj.prop.otherprop.another)是否已定义?
if(obj && obj.prop && obj.prop.otherprop && obj.prop.otherprop.another)
这个功能能够正常运行,但是比较丑陋。
如何推荐地检查对象属性(例如obj.prop.otherprop.another)是否已定义?
if(obj && obj.prop && obj.prop.otherprop && obj.prop.otherprop.another)
这个功能能够正常运行,但是比较丑陋。
最高效的方法是在try{} catch(exception){} 块中检查obj.prop.otherprop.another。如果所有其余元素都存在,则这将是最快的方法;否则,异常将被处理。
var a = null;
try {
a = obj.prop.otherprop.another;
} catch(e) {
obj = obj || {};
obj.prop = obj.prop || {};
obj.prop.otherprop = obj.prop.otherprop || {};
obj.prop.otherprop.another = {};
a = obj.prop.otherprop.another ;
}
不是说这个更好,但是...
x = null
try {
x = obj.prop.otherprop.another;
} catch() {}
// ...
或者其他选择...
function resolve(obj, path) {
path = path.split('.');
while (path.length && obj) obj = obj[path.shift()];
return obj;
}
x = resolve(obj, 'prop.otherprop.another');
... 但我想实际答案是没有一个最佳实践。至少我不知道有。
if ((((obj || {}).prop || {}).anotherprop || {}).another) { ... }
但我不知道初始化三个新对象是否真的值得不必反复输入路径。