为什么Node.js项目中forEach可正常运行,for in循环却返回undefined?
问题根因
你遇到的输出undefined的本质原因是误用了for...in的遍历逻辑,而非普通for循环和forEach的差异:for...in遍历得到的是对象的可枚举属性名,而你调用loadNotes()返回的是数组类型的笔记列表,数组的默认可枚举属性就是字符串格式的下标(如'0'、'1')。此时你拿到的note变量是下标字符串,不是笔记对象本身,访问字符串的title属性自然返回undefined。
如果一定要用for...in实现相同逻辑,需要改为通过下标取数组元素:
const notes = loadNotes() for (let index in notes) { console.log(notes[index].title) }
但非常不推荐用for...in遍历数组,存在诸多隐患。
for...in和数组forEach的核心差异
- 遍历目标与返回值不同
forEach是数组原型的内置方法,专门用于遍历数组元素,回调函数第一个参数直接返回当前遍历到的数组元素本身,就是你需要的笔记对象。for...in是通用的对象属性遍历语法,返回的是对象的可枚举属性名(字符串类型),不仅可以用来遍历数组,还可以遍历普通对象。 - 遍历范围不同
forEach只会按顺序遍历数组的有效下标元素,不会遍历到数组额外挂载的自定义属性、以及原型链上继承的属性。for...in会遍历数组所有可枚举属性,包括你手动给数组挂载的自定义属性、原型链上继承的可枚举属性,比如你给数组加了notes.remark = '个人笔记',for...in会把remark也当作遍历项,导致逻辑异常。 - 流程控制能力不同
forEach遍历过程中无法使用break、continue中断或跳过遍历,除非主动抛出错误终止执行。for...in遍历过程中可以正常使用break、continue控制遍历流程。
补充说明
如果你想用普通for循环(非for...in)实现相同功能,写法如下,性能比forEach更高且支持流程控制:
const notes = loadNotes() for (let i = 0; i < notes.length; i++) { console.log(notes[i].title) }
内容的提问来源于stack exchange,提问作者aichex
相关产品推荐
相关产品推荐

