JS 原生数组(Array)的迭代器 不是 基于生成器(Generator)实现的

虽然生成器可以很轻松地实现一个迭代器,但 Array、Map、Set 等内建可迭代对象的迭代器都是引擎内部用 C++/内部字节码实现的专用迭代器,不是生成器。


🧩 一句话回答

原生数组迭代器不是用 Generator 实现的,而是引擎用内部优化的 Iterator 实现的。


🧠 为什么不是基于生成器?

主要原因:

1. 性能要爆炸快

生成器是“用户态” JS 代码,会有上下文切换和状态机开销。

但数组遍历是 JS 最基础、出现频率最高的操作之一,必须做到:

  • 特殊优化

  • 零额外开销

  • 快速解引用、指针移动

  • JIT 引擎可内联优化

因此 V8、SpiderMonkey、JavaScriptCore 都在内部使用:

专用的 ArrayIterator 对象(C++ 层实现)

而不是 Generator。


🧠 如何验证?

你可以打印数组的迭代器:

 
const it = [1, 2, 3][Symbol.iterator](); console.log(it);

你会发现输出类似:

 
Array Iterator {} (V8)

或者 Firefox:

 
ArrayIterator {}

不是 GeneratorFunction、不是 GeneratorObject。

Generator 会返回类似:

 
function* g() {} const it = g(); console.log(it); // g {<suspended>}

两种对象完全不同。

posted @ 2025-12-10 10:22  jerry-mengjie  阅读(7)  评论(0)    收藏  举报