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

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

在我的代码中,我处理的数组中有一些条目,其中有许多对象彼此嵌套,而有些则没有。它看起来像下面这样:

// where this array is hundreds of entries long, with a mix// of the two examples givenvar 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,如果它存在,但没有抛出错误?


侃侃无极
浏览 3293回答 3
3回答

森栏

你正在做的事情引发了一个例外(理所当然)。你总能这样做try{ &nbsp;&nbsp;&nbsp;window.a.b.c}catch(e){ &nbsp;&nbsp;&nbsp;console.log("YO",e)}但我不会想到你的用例。你为什么要访问数据,嵌套你不熟悉的6个级别?什么用例证明了这一点?通常,您希望实际验证您正在处理的对象类型。另外,在旁注中你不应该使用这样的语句,if(a.b)因为如果ab为0或者即使它是“0”它将返回false。而是检查是否a.b !== undefined

四季花海

如果我正确理解您的问题,您需要最安全的方法来确定对象是否包含属性。最简单的方法是使用“in”语句。window.a&nbsp;=&nbsp;"aString";//window&nbsp;should&nbsp;have&nbsp;'a'&nbsp;property//lets&nbsp;test&nbsp;if&nbsp;it&nbsp;existsif&nbsp;("a"&nbsp;in&nbsp;window){ &nbsp;&nbsp;&nbsp;&nbsp;//true &nbsp;}if&nbsp;("b"&nbsp;in&nbsp;window){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//false &nbsp;}当然,您可以根据需要将其嵌套if&nbsp;("a"&nbsp;in&nbsp;window.b.c)&nbsp;{&nbsp;}不确定这是否有帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript