获取JavaScript嵌套数组对象值异常:output._result[0].title返回undefined的原因
为什么能拿到对象但访问属性返回undefined?
这种情况我之前排查过好几次,大概率是下面几个原因导致的,咱们一步步来分析:
1. 属性名藏了不可见的特殊字符
看起来你看到的是"title",但实际这个属性名可能带了空格、全角空格或者零宽空格这类肉眼难辨的字符。比如实际键名是" title"(前面多了空格)或者"title\u200B"(零宽空格),这时候用"title"自然访问不到。
你可以用这些代码验证:
// 打印所有可枚举的属性名,看看实际键是什么 console.log(Object.keys(output._result[0])); // 遍历所有属性,直接输出键和对应的值 for (const key in output._result[0]) { console.log(`实际键名:"${key}",对应值:${output._result[0][key]}`); }
如果输出的键名和你以为的"title"不一样,比如多了空格,那就是这个问题了。
2. 对象是Proxy代理实例
如果这个output._result[0]是通过Proxy创建的代理对象,控制台显示的内容可能是代理的get陷阱返回的“展示用”数据,但实际访问title属性时,代理的逻辑没有正确返回对应的值,导致返回undefined。
你可以用这段代码判断是不是Proxy:
console.log(output._result[0] instanceof Proxy); // 或者查看属性的描述符,看看实际有没有这个属性 console.log(Object.getOwnPropertyDescriptors(output._result[0]));
3. 控制台显示的是对象快照而非实时状态
浏览器控制台有时候会延迟解析对象,你看到的output._result[0]的内容可能是后续才赋值的,但你访问title的时候,这个属性还没被设置。这种情况比较少见,但可以用JSON序列化来验证:
console.log(JSON.stringify(output._result[0]));
如果序列化后的字符串里没有"title"字段,那说明控制台显示的是旧的快照,实际对象当时还没有这个属性。
4. 属性是Symbol类型的键
虽然控制台显示的是"title",但实际这个属性的键是一个Symbol而不是字符串。这时候用字符串"title"访问肯定拿不到值。你可以用这段代码查看有没有Symbol键:
console.log(Object.getOwnPropertySymbols(output._result[0]));
如果输出里有Symbol,试试用这个Symbol去访问属性。
内容的提问来源于stack exchange,提问作者Daman
相关产品推荐
相关产品推荐

