检查是否定义了像 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) { ... }
但我不知道初始化三个新对象是否真的值得不必重复输入路径。