6

检查是否定义了像 obj.prop.otherprop.another 这样的对象属性的推荐方法是什么?

if(obj && obj.prop && obj.prop.otherprop && obj.prop.otherprop.another)

这很好用,但足够丑陋。

4

3 回答 3

3

最有效的方法是在 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 ;
}
于 2013-02-15T18:13:13.567 回答
0

不是说这更好,但是...

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');

...但我想实际的答案是没有最佳实践。不是我知道的。

于 2013-02-15T17:51:12.630 回答
0

如果你心情很傻,这会起作用:

if ((((obj || {}).prop || {}).anotherprop || {}).another) { ... }

但我不知道初始化三个新对象是否真的值得不必重复输入路径。

于 2013-02-15T18:01:27.227 回答