登录
首页 >  文章 >  前端

JavaScript迭代器原理及自定义技巧

时间:2026-04-15 21:14:38 239浏览 收藏

JavaScript迭代器是ES6引入的核心机制,其本质是一个通过next()方法返回{value, done}对象的状态机,而实现[Symbol.iterator]接口的对象则成为可被for...of、展开运算符等原生语法消费的“可迭代对象”;文章深入剖析了迭代器的工作原理、手动创建方式、为任意对象赋予迭代能力的技巧,并重点展示了生成器函数(function*)如何以极简、安全、声明式的方式替代繁琐的手动状态管理,让序列生成、无限流处理和复杂遍历逻辑变得清晰可靠——掌握它,你就真正理解了现代JavaScript中数据消费与懒求值的底层脉搏。

JavaScript迭代器如何工作_如何自定义迭代器?

JavaScript迭代器的核心是next()方法,它每次调用返回一个形如{ value: ..., done: true|false }的对象。只要对象有这个next方法,它就是一个迭代器;而实现了[Symbol.iterator]()方法的对象,则是可迭代的(比如数组、字符串、Map等),能被for...of、展开运算符、解构等语法消费。

迭代器的工作机制

迭代器本质是一个状态机:内部维护当前遍历位置和是否结束的状态。next()被调用时,它推进状态、返回当前值,并标记是否已完成。

  • 第一次调用next(),通常返回第一个元素,done: false
  • 持续调用直到某次返回{ value: undefined, done: true },表示遍历结束
  • for...of会自动反复调用next(),直到donetrue才停止
  • 如果迭代器中途抛错,或next()返回格式错误(如缺valuedone),会中断遍历

手动创建一个简单迭代器

只需写一个函数,返回带next()方法的对象:

function createRangeIterator(start, end) {
  let current = start;
  return {
    next() {
      if (current 

<h3>让对象支持<code>for...of</code>:实现<code>[Symbol.iterator]</code></h3>
<p>给任意对象添加<code>[Symbol.iterator]</code>方法,就能让它变成可迭代对象:</p>
<pre class="brush:php;toolbar:false;">const countdown = {
  from: 3,
  [Symbol.iterator]() {
    let current = this.from;
    return {
      next() {
        if (current > 0) {
          return { value: current--, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
};

for (const num of countdown) {
  console.log(num); // 3, 2, 1
}

注意:[Symbol.iterator]必须返回一个迭代器对象(即含next()的对象),不能直接返回值或普通对象。

用生成器函数简化自定义迭代器

生成器函数(function*)是创建迭代器最简洁的方式——函数体内的yield会自动暂停/恢复执行,并封装好next()逻辑:

const fibonacci = {
  *[Symbol.iterator]() {
    let a = 0, b = 1;
    while (true) {
      yield a;
      [a, b] = [b, a + b];
    }
  }
};

// 取前5个斐波那契数
const fibIter = fibonacci[Symbol.iterator]();
console.log(fibIter.next().value); // 0
console.log(fibIter.next().value); // 1
console.log(fibIter.next().value); // 1
console.log(fibIter.next().value); // 2
console.log(fibIter.next().value); // 3

// 或直接用 for...of(但注意无限生成器需手动限制)
for (const n of fibonacci) {
  if (n > 10) break;
  console.log(n); // 0, 1, 1, 2, 3, 5, 8
}

生成器函数天然返回迭代器,适合处理序列、异步流、树遍历等场景,代码更清晰、状态管理更安全。

基本上就这些。迭代器不复杂但容易忽略细节——关键是理解next()的契约和[Symbol.iterator]的桥梁作用。用生成器写,基本不用手造状态机。

今天关于《JavaScript迭代器原理及自定义技巧》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>