登录
首页 >  文章 >  前端

JavaScript迭代器:可迭代对象与协议详解

时间:2026-03-06 18:11:33 434浏览 收藏

JavaScript中的迭代器与可迭代协议是统一遍历机制的核心——可迭代对象通过实现Symbol.iterator方法提供遍历入口,而迭代器则通过next()方法按需返回{value, done}结构的数据,共同支撑for...of等语法的优雅运行;掌握这两项协议不仅能深入理解数组、字符串、Map等内置类型的遍历原理,更能让你轻松为自定义数据结构赋予标准、灵活且兼容性极佳的迭代能力。

JavaScript 迭代器:实现可迭代对象与迭代器协议

在 JavaScript 中,迭代器(Iterator)和可迭代对象(Iterable)是处理集合数据的核心机制。它们让数组、字符串、Map 等原生类型可以被 for...of 循环遍历,同时也为自定义数据结构提供统一的迭代方式。理解并实现迭代器协议,有助于写出更灵活、兼容性更强的代码。

什么是迭代器协议与可迭代协议?

JavaScript 使用两个相关但不同的协议来定义如何遍历对象:

  • 可迭代协议(Iterable Protocol):规定一个对象是否可被遍历。只要对象实现了 Symbol.iterator 方法,它就是可迭代的。
  • 迭代器协议(Iterator Protocol):定义一个对象如何逐个返回值,并表明是否遍历完成。迭代器必须有 next() 方法,返回格式为 { value: any, done: boolean } 的对象。

当你在 for...of 中使用一个对象时,JavaScript 会自动调用它的 [Symbol.iterator]() 方法获取迭代器,然后反复调用该迭代器的 next() 方法,直到 done: true

手动实现一个可迭代对象

下面是一个简单的计数器类,它既是可迭代对象,也返回一个符合迭代器协议的对象:

class Counter {
  constructor(start, end) {
    this.start = start;
    this.end = end;
  }

  [Symbol.iterator]() {
    let current = this.start;
    const end = this.end;

    return {
      next() {
        if (current 

这里,Counter 类实现了 [Symbol.iterator] 方法,每次调用都返回一个新的迭代器对象。这样就能支持多次遍历,互不干扰。

让自定义数据结构可迭代

假设你写了一个简单的范围类 Range,表示一个整数区间。为了让它能被 for...of 遍历,只需加上 [Symbol.iterator]

class Range {
  constructor(from, to) {
    this.from = from;
    this.to = to;
  }

  [Symbol.iterator]() {
    let value = this.from;
    return {
      next: () => {
        if (value 

现在 Range 实例可以用于展开运算符、for...ofArray.from() 等所有接受可迭代对象的地方。

迭代器的复用与状态管理

注意,每个 [Symbol.iterator]() 调用应返回一个独立的迭代器。这保证了多个循环不会互相影响:

const r = new Range(1, 2);
const iter1 = r[Symbol.iterator]();
const iter2 = r[Symbol.iterator]();

console.log(iter1.next()); // { value: 1, done: false }
console.log(iter2.next()); // { value: 1, done: false } —— 不受影响

如果返回的是同一个迭代器实例,第二次遍历时可能已经结束。因此通常在 [Symbol.iterator] 内部创建并返回新的迭代器对象,确保状态隔离。

基本上就这些。掌握迭代器协议后,你可以让任何数据结构融入 JavaScript 的遍历生态,写出更自然、更通用的 API。不复杂但容易忽略。

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

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