数组的 values() 方法返回惰性迭代器,按索引顺序逐个产出元素,不预加载全部数据;适用于大型数组的按需取值、提前退出、轻量切片及与生成器组合实现自定义流。

数组的 values() 方法返回一个迭代器,它按索引顺序逐个产出数组元素,不一次性加载全部数据到内存。这对大型数组(如数万项以上)做“按需取值”非常关键——比如只读前几项、配合 break 提前退出、或与 for...of / Array.from({ length: N }) 配合实现轻量切片。
values() 迭代器的本质是惰性求值
调用 arr.values() 本身几乎不消耗资源,它只是创建一个指向数组内部状态的对象,真正取值发生在每次 next() 调用时。这意味着:
- 不会触发整个数组的拷贝或遍历初始化
- 即使数组长度为 100 万,
const it = bigArr.values()也瞬间完成 - 如果只调用 3 次
it.next(),就只访问前 3 个索引,其余元素完全不参与计算
替代 slice() + for 循环,避免中间数组开销
传统写法 bigArr.slice(0, 10).forEach(...) 会先生成一个新数组(10 个元素),哪怕你只需要其中部分值。用 values() 可跳过这步:
map()
- 错误示范:
bigArr.filter(x => x > 100)[0]—— 扫描全部、新建数组、再取首项 - 推荐写法:
for (const item of bigArr.values()) { if (item > 100) { console.log('找到第一个大于100的值:', item); break; // 立即退出,后续元素不访问 } }
与生成器组合,实现自定义“按需流”
可将 values() 封装进生成器,添加节流、采样、转换等逻辑,保持下游仍为惰性:
function* takeEveryNth(arr, n) {
let i = 0;
for (const val of arr.values()) {
if (i % n === 0) yield val;
i++;
}
}
// 使用:只访问索引为 0、5、10、15… 的元素,无需预生成子数组
for (const x of takeEveryNth(bigArr, 5)) {
process(x);
}










