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循环。 - 步骤:
- 为对象添加
Symbol.iterator方法。 - 该方法返回一个迭代器(包含
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中循环和解构等功能的基石。