JavaScript中的迭代协议与可迭代对象
字数 902 2025-11-10 09:00:54

JavaScript中的迭代协议与可迭代对象

描述
迭代协议是ES6引入的一组规则,分为可迭代协议和迭代器协议。它们定义了如何遍历数据结构,是for...of循环、扩展运算符等特性的基础。理解迭代协议能帮助你掌握现代JavaScript中数据处理的底层机制。

1. 可迭代协议(Iterable Protocol)

  • 规则:对象必须实现@@iterator方法(即键为Symbol.iterator的方法),该方法返回一个迭代器对象。
  • 示例:数组、字符串、Map、Set都是内置可迭代对象。
const arr = [1, 2];
console.log(typeof arr[Symbol.iterator]); // "function"

2. 迭代器协议(Iterator Protocol)

  • 规则:迭代器是包含next()方法的对象。每次调用next()返回{ value: any, done: boolean }
    • value:当前迭代的值。
    • done:布尔值,表示迭代是否结束(结束时为true)。
  • 示例:手动调用数组的迭代器:
const iterator = arr[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

3. 自定义可迭代对象

  • 场景:让普通对象支持for...of循环。
  • 步骤
    1. 为对象添加Symbol.iterator方法。
    2. 该方法返回一个迭代器(包含next()方法)。
  • 示例:创建一个范围数字的可迭代对象:
const range = {
  start: 1,
  end: 3,
  [Symbol.iterator]() {
    let current = this.start;
    return {
      next: () => {
        if (current <= this.end) {
          return { value: current++, done: false };
        }
        return { value: undefined, done: true };
      }
    };
  }
};

for (const num of range) {
  console.log(num); // 依次输出 1, 2, 3
}

4. 迭代协议的应用场景

  • 语言特性
    • for...of循环(如for (let item of iterable))。
    • 扩展运算符(如[...iterable])。
    • 解构赋值(如const [a, b] = iterable)。
  • 内置API
    • Array.from(iterable):将可迭代对象转为数组。
    • new Map(iterable):用键值对可迭代对象初始化Map。

5. 提前终止迭代

  • 迭代器可能实现return()方法,当迭代提前退出(如break或抛出错误)时自动调用:
const iterator = range[Symbol.iterator]();
iterator.return = function() {
  console.log("迭代提前终止");
  return { done: true }; // 必须返回对象
};
for (let num of iterator) {
  if (num > 1) break; // 触发return()方法
}

总结
迭代协议通过统一规则让不同对象支持遍历操作。自定义可迭代对象时,需确保Symbol.iterator返回正确的迭代器,并遵循next()返回值的格式。这一机制是JavaScript中循环和解构等功能的基石。

JavaScript中的迭代协议与可迭代对象 描述 迭代协议是ES6引入的一组规则,分为可迭代协议和迭代器协议。它们定义了如何遍历数据结构,是 for...of 循环、扩展运算符等特性的基础。理解迭代协议能帮助你掌握现代JavaScript中数据处理的底层机制。 1. 可迭代协议(Iterable Protocol) 规则 :对象必须实现 @@iterator 方法(即键为 Symbol.iterator 的方法),该方法返回一个迭代器对象。 示例 :数组、字符串、Map、Set都是内置可迭代对象。 2. 迭代器协议(Iterator Protocol) 规则 :迭代器是包含 next() 方法的对象。每次调用 next() 返回 { value: any, done: boolean } : value :当前迭代的值。 done :布尔值,表示迭代是否结束(结束时为 true )。 示例 :手动调用数组的迭代器: 3. 自定义可迭代对象 场景 :让普通对象支持 for...of 循环。 步骤 : 为对象添加 Symbol.iterator 方法。 该方法返回一个迭代器(包含 next() 方法)。 示例 :创建一个范围数字的可迭代对象: 4. 迭代协议的应用场景 语言特性 : for...of 循环(如 for (let item of iterable) )。 扩展运算符(如 [...iterable] )。 解构赋值(如 const [a, b] = iterable )。 内置API : Array.from(iterable) :将可迭代对象转为数组。 new Map(iterable) :用键值对可迭代对象初始化Map。 5. 提前终止迭代 迭代器可能实现 return() 方法,当迭代提前退出(如 break 或抛出错误)时自动调用: 总结 迭代协议通过统一规则让不同对象支持遍历操作。自定义可迭代对象时,需确保 Symbol.iterator 返回正确的迭代器,并遵循 next() 返回值的格式。这一机制是JavaScript中循环和解构等功能的基石。