数组 values() 方法返回惰性迭代器,按索引顺序按需产出元素值,具备零拷贝、单次遍历特性,适合大型数组流式处理,与 for...of 等配合仍保持惰性。

数组的 values() 方法返回一个迭代器,它按索引顺序逐个产出数组元素的值。这个迭代器是惰性的(lazy),不预先计算或复制整个数组,因此天然支持“按需取值”——即只在你调用 next() 时才读取当前项,适合处理大型原始数组(如 Uint8Array、Float64Array 或普通 Array)而无需一次性加载全部数据到内存。
values() 迭代器的核心特性
惰性求值 + 零拷贝 + 单次遍历 是它实现“按需取值”的基础:
- 不创建新数组,不触发深拷贝,直接引用原始数组的内存位置(对类型化数组尤其高效)
- 每次调用
iterator.next()才读取下一个索引处的值,跳过未访问的部分 - 无法倒退或随机访问,但正符合“流式处理”场景的需求
- 与
for...of、Array.from()、展开语法等配合时,行为仍保持惰性(除非显式转为数组)
典型按需取值场景与写法
以下操作均不会提前遍历整个数组:
-
取前 N 项:用
for...of配合计数器中断
const iter = arr.values();
for (const v of iter) {
if (count++ >= 100) break;
process(v);
} -
查找首个匹配项:用
find或手动next()循环
const iter = arr.values();
let result;
while (!(result = iter.next()).done) {
if (result.value > threshold) break;
} -
分块处理(如每 1024 项一批):结合
take类辅助函数(可用生成器封装)
function* take(iter, n) {
let i = 0;
for (const v of iter) {
if (i++ >= n) break;
yield v;
}
}
// 使用:
for (const chunk of take(arr.values(), 1024)) { ... }
与普通 for 循环或 map 的关键区别
对比常见误用,突显 values() 的按需优势:
-
arr.map(x => x * 2)→ 立即创建等长新数组,内存占用翻倍 for (let i = 0; i → 虽不分配新数组,但逻辑上仍需完整遍历控制,不易中途退出或流式组合-
[...arr.values()]或Array.from(arr.values())→ 强制展开为完整数组,完全失去“按需”意义 -
arr.values()本身只是轻量对象(含next方法),创建开销几乎为零
对大型类型化数组的特别提示
对于 Uint32Array、Float64Array 等,values() 迭代器直接读取底层缓冲区,无装箱开销:
- 比
for (let i = 0; i 更语义清晰,且便于管道化(如与 <code>filter、reduce组合) - 注意:不能用
values()修改原数组(它是只读迭代器),修改仍需通过索引赋值 - 若需带索引处理,用
entries();若只需键,用keys()—— 三者均为惰性

















