从独立JS文件访问子属性时出现undefined问题的技术求助
解决遍历对象属性时返回undefined的问题
嘿,我完全懂你踩的这个坑!咱们先把问题拆明白:
你用for...in循环遍历persons对象时,循环变量name拿到的其实是对象的键名——也就是字符串类型的"something"和"somethingtwo",而不是这些键对应的那个包含email、num的子对象。所以你直接写name.email,本质是在问一个字符串有没有email属性,结果自然是undefined啦。
几种正确的解决方法
方法1:通过键名访问原对象的对应属性
这是最直接的修改方式,利用循环拿到的键名,去persons对象里取出对应的子对象,再访问它的属性:
var persons = require('./data.js'); var getAName = function() { for(var key in persons) { // 用persons[key]获取对应子对象,再访问email console.log(persons[key].email); // 同理,访问num就是persons[key].num } }
我把变量名改成key了,这样更直观,避免和子对象里的name属性混淆~
方法2:用Object.values()直接遍历对象的值
如果你只关心对象里的子对象,不需要键名的话,可以用Object.values()把对象的所有值转换成数组,再用for...of循环遍历:
var persons = require('./data.js'); var getAName = function() { // Object.values(persons)会返回[something对象, somethingtwo对象] for(const person of Object.values(persons)) { console.log(person.email); } }
这种方式代码更简洁,也更符合现代JS的写法。
方法3:用Object.entries()同时获取键和值
如果既需要键名,又需要子对象的话,Object.entries()会把对象转换成[键, 值]的数组,遍历起来很方便:
var persons = require('./data.js'); var getAName = function() { for(const [key, person] of Object.entries(persons)) { console.log(`键名:${key},邮箱:${person.email}`); } }
额外小提示
如果你的对象可能继承了其他原型链上的属性,用for...in的时候可以加个判断,确保只遍历自身的属性:
for(var key in persons) { if(persons.hasOwnProperty(key)) { console.log(persons[key].email); } }
不过在你的场景里,因为是自己导出的纯对象,这个判断不是必须的,但了解一下总是好的~
内容的提问来源于stack exchange,提问作者Mann
相关产品推荐
相关产品推荐

