Iterator.prototype.map 返回新迭代器而非数组,调用 next() 时才执行映射,实现惰性求值与内存友好;适用于海量或无限数据源,支持链式组合及 for...of 按需消费。

直接在迭代器上用 Iterator.prototype.map,就能避免创建中间数组,实现真正惰性、内存友好的数据流处理。
为什么 map 不触发立即计算
Iterator.prototype.map 返回的是一个新迭代器,不是数组。它不会遍历原始数据,也不分配额外内存来存全部结果 —— 每次调用 next() 时才执行映射函数,拿一个算一个。
这对海量或无限数据源(如日志流、传感器读数、生成器产生的序列)特别关键:你只消耗当前项的内存,而不是整个数据集。
基础用法与链式组合
只要对象是可迭代的(Array、Set、Map、Generator 等),都能直接调用 .map():
-
对数组值做变换:
[1, 2, 3].values().map(x => x * 10) -
处理 Map 的键或值:
myMap.values().map(val => String(val)) -
串联 filter + map:
gen().filter(x => x > 100).map(x => x.toString())
配合 for...of 或手动 next 使用
不转数组,也能安全消费结果:
-
用 for...of 自动迭代:
for (const s of data.values().map(n => `item-${n}`)) { console.log(s); } -
按需取前 N 项(比如只取前 10 条):
const iter = hugeGen().map(transform); for (let i = 0; i
注意事项与边界情况
该方法已在主流环境(Chrome 124+、Firefox 125+、Node.js 20.12+)稳定支持,无需 polyfill。但要注意:
- 原迭代器必须已部署
Symbol.iterator,且其next()方法符合协议 -
map函数内抛错会中断迭代,错误在首次next()调用时抛出 - 不支持异步映射;如需 async/await,应使用
AsyncIterator及其配套提案(如AsyncIterator.prototype.map)

















