当前位置: 首页 > 知识库问答 >
问题:

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

丁均
2023-03-14

在我的代码中,我处理一个数组,该数组中有一些条目,其中许多对象嵌套在另一个条目中,而有些条目则没有。它看起来如下所示:

// 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,如果它存在,但不抛出一个错误?

共有3个答案

梁丘柏
2023-03-14

如果我正确理解你的问题,你想要最安全的方法来确定一个对象是否包含属性。

最简单的方法是在运算符中使用

window.a = "aString";
//window should have 'a' property
//lets test if it exists
if ("a" in window){
    //true
 }

if ("b" in window){
     //false
 }

你当然可以想多深就多深

if ("a" in window.b.c) { }

不确定这是否有帮助。

壤驷文华
2023-03-14

你所做的会引发一个例外(这是理所当然的)。

你总能做到

try{
   window.a.b.c
}catch(e){
   console.log("YO",e)
}

但我不会去想你的用例。

为什么要访问您不熟悉的6层嵌套数据?什么用例证明了这一点?

通常,您希望实际验证您正在处理的对象类型。

另外,在旁注中,您不应该使用类似于if(a.b)的语句,因为如果a.b为0,甚至是“0”,它将返回false。而是检查a.b!==未定义

丘学海
2023-03-14

更新:

  • 如果根据ECMAScript 2020或更高版本使用JavaScript,请参阅可选链接
  • TypeScript在3.7版中增加了对可选链接的支持
// use it like this
obj?.a?.lot?.of?.properties

ECMASCript 2020之前的JavaScript或3.7版本以上的TypeScript解决方案:

快速解决方法是使用带有ES6箭头功能的try/catch辅助函数:

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'));
 类似资料:
  • 问题内容: 在我的代码中,我处理了一个数组,其中包含一些条目,其中许多对象彼此嵌套,而有些则没有。它看起来像以下内容: 这给我带来了问题,因为我有时需要遍历数组,而不一致给我带来了如下错误: 我知道我可以说,但这在最多嵌套5个或6个对象的情况下非常繁琐。有没有其他(更简便的)方法可以让它仅在console.log存在的情况下执行,而不会引发错误? 问题答案: 更新 : 如果您使用符合ECMAScr

  • 问题内容: 我是Reactjs的新手。我正在尝试做一个非常简单的事情:当用户在文本区域内更改文本时,在render函数中更新div。有什么建议? 问题答案: 您应该绑定该函数。您收到此错误的原因是,在handleChange函数中,键盘操作未引用React类的上下文,因此您需要绑定该函数。 看到这个答案

  • 我搜索了这个网站,发现了类似的问题,但没有解决我的问题。当我滚动到一个div时,我试图使它固定在屏幕顶部。但我一直在犯错误: "(index): 59未捕获类型错误:无法读取未定义的属性'top'at(index): 59" 我还在学习jQuery,不能解决这个问题。

  • 问题内容: 我正在使用jQuery将表单字段发布到PHP文件,该文件仅根据是否工作而返回1/0。 代码摘录: 但是,每次成功(html == 1)时,控制台都会引发错误“未捕获的TypeError:无法读取未定义的属性’defaultView’”,并且警报永远不会发生…? Google似乎没有关于此错误和jQuery的大量信息,谁知道原因? 问题答案: 这是因为以前不是您要处理的内容,现在是jQu

  • 我的代码: 错误: 未处理PromisejectionWarning:TypeError:无法读取未定义的未处理PromisejectionWarning:未处理的promise拒绝的属性“forEach”。此错误源于在没有catch块的情况下抛出异步函数的内部,或者拒绝使用未处理的promise。catch()。(拒绝id:1)(节点:7188)[DEP0018]弃用警告:未处理的promise

  • 我正在尝试集成一个Datatable插件(https://www.npmjs.com/package/vuejs-datatable)在我的Vue应用程序中,我的控制台出现了一个错误。 我的dataTable.vue文件: 每当我尝试使用Vue时。使用(PluginName)'当集成插件时,我会遇到类似的错误。我是VueJS的新手。有什么我需要做的吗?