小编典典

如何避免“无法读取未定义的属性”错误?

javascript

在我的代码中,我处理了一个数组,其中包含一些条目,其中许多对象彼此嵌套,而有些则没有。它看起来像以下内容:

// where this array is hundreds of entries long, with a mix
// of the two examples given
var test = [{'a':{'b':{'c':"foo"}}}, {'a': "bar"}];

这给我带来了问题,因为我有时需要遍历数组,而不一致给我带来了如下错误:

for (i=0; i<test.length; i++) {
    // ok on i==0, but 'cannot read property of undefined' on i==1
    console.log(a.b.c);
}

我知道我可以说if(a.b){console.log(a.b.c)},但这在最多嵌套5个或6个对象的情况下非常繁琐。有没有其他(更简便的)方法可以让它仅在console.log存在的情况下执行,而不会引发错误?


阅读 980

收藏
2020-04-25

共1个答案

小编典典

更新

  • 如果您使用符合ECMAScript 2020或更高版本的JavaScript,请参阅可选链接。
  • TypeScript在[3.7版中增加了对可选链接的支持。

    // use it like this
    obj?.a?.lot?.of?.properties


ECMASCript 2020或早于3.7版的TypeScript之前的JavaScript解决方案

一个快速的解决方法是将try / catch辅助函数与ES6 箭头函数一起使用:

function getSafe(fn, defaultVal) {
    try {
        return fn();
    } catch (e) {
        return defaultVal;
    }
}

// use it like this
getSafe(() => obj.a.lot.of.properties);

// or add an optional default value
getSafe(() => obj.a.lot.of.properties, 'nothing');

工作片段:

function getSafe(fn, defaultVal) {

  try {

    return fn();

  } catch (e) {

    return defaultVal;

  }

}



// use it like this

console.log(getSafe(() => obj.a.lot.of.properties));



// or add an optional default value

console.log(getSafe(() => obj.a.lot.of.properties, 'nothing'));
2020-04-25