JavaScript中for...in循环遍历对象的机制及属性访问疑问
为什么for...in循环中直接访问
crewMember.name会返回undefined? 核心原因很简单:for...in循环遍历的是对象的属性名(键),而非属性对应的值。
看你最初的代码:
for (let crewMember in spaceship.crew){ console.log(`${crewMember}: ${crewMember.name}`); }
这里的crewMember其实是spaceship.crew对象的属性名字符串——也就是"captain"、"chief officer"、"medic"、"translator"这些字符串。字符串本身并没有name属性,所以crewMember.name自然会返回undefined。
而当你修改为spaceship.crew[crewMember].name时,你做了两步关键操作:
- 通过
spaceship.crew[crewMember],用属性名字符串取出了对应的属性值(也就是每个船员的对象,比如{name: 'Lily', degree: 'Computer Engineering', ...}) - 再从这个船员对象上访问
name属性,自然就能得到正确的姓名。
举个更简洁的例子帮你理解:
const team = { leader: { name: "Jack" }, member: { name: "Rose" } }; for (let key in team) { console.log(key); // 输出 "leader"、"member"(都是字符串) console.log(team[key]); // 输出 {name: "Jack"}、{name: "Rose"}(属性值) console.log(team[key].name); // 输出 "Jack"、"Rose" }
最后再提炼下关键点:
for...in循环的迭代变量是对象的属性名字符串,不是属性对应的实际值- 要获取属性值,必须通过
对象[属性名]的方式(如果属性名是合法标识符也可以用.,但像chief officer这种带空格的属性名只能用方括号) - 只有拿到属性值(也就是船员对象)后,才能访问它的
name等属性
内容的提问来源于stack exchange,提问作者Will Barrett
相关产品推荐
相关产品推荐

