登录
首页 >  文章 >  前端

JavaScript迭代器是什么?如何自定义迭代对象

时间:2026-04-29 11:42:37 457浏览 收藏

JavaScript中的迭代器是一种按需逐个获取序列值的统一遍历机制,核心在于实现返回{value, done}对象的next()方法;而可迭代对象则通过部署[Symbol.iterator]方法,使自身能被for...of、展开运算符等现代语法自然消费——本文深入浅出地解析了迭代器协议的本质,手把手演示如何手动构建迭代器、为自定义类添加可迭代能力,并重点推荐用生成器函数(function*)大幅简化开发,兼顾清晰性与实用性,助你轻松驾驭惰性求值、无限序列乃至大数据流处理场景。

javascript中迭代器是什么_如何自定义可迭代对象

迭代器是 JavaScript 中一种统一的遍历机制,它允许你按需逐个获取一个序列中的值;而可迭代对象则是实现了 [Symbol.iterator] 方法的对象,能被 for...of、展开运算符(...)、解构等语法消费。

迭代器的核心:Iterator 接口

一个迭代器是一个对象,必须有 next() 方法,该方法返回形如 { value, done } 的对象:

  • value:当前迭代出的值(可以是任意类型)
  • done:布尔值,true 表示迭代结束,false 表示还有值可取

例如手动创建一个简单迭代器:

const createCounter = (start = 0) => {
  let current = start;
  return {
    next() {
      return { value: current++, done: false };
    }
  };
};

const it = createCounter(1);
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
// ⚠️ 注意:这个例子不会自动停止,实际中需加终止条件

可迭代对象:实现 [Symbol.iterator]

只要对象拥有一个名为 Symbol.iterator 的方法,且该方法返回一个符合迭代器协议的对象,它就是可迭代的。

例如,让一个自定义类支持 for...of

class Countdown {
  constructor(n) {
    this.n = n;
  }

  [Symbol.iterator]() {
    let i = this.n;
    return {
      next() {
        if (i > 0) {
          return { value: i--, done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
}

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

更简洁写法:用生成器函数替代手写迭代器

生成器函数(function*)天然返回迭代器,大幅简化逻辑:

class Countdown {
  constructor(n) {
    this.n = n;
  }

  *[Symbol.iterator]() {
    for (let i = this.n; i > 0; i--) {
      yield i;
    }
  }
}

console.log([...new Countdown(3)]); // [3, 2, 1]

生成器内部自动维护状态,yield 暂停执行并产出值,下次调用 next() 继续运行,无需手动管理 donevalue

常见可迭代对象与注意事项

原生可迭代对象包括:ArrayStringMapSetTypedArray 等。但 Object 默认不可迭代 —— 它没有 [Symbol.iterator] 方法。

  • 检查是否可迭代:typeof obj[Symbol.iterator] === 'function'
  • 自定义时注意:每次调用 [Symbol.iterator] 应返回**新迭代器**,避免多次遍历相互影响
  • 迭代器应是“惰性”的:值只在调用 next() 时计算,适合处理大数据或无限序列

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

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