JavaScript中Symbol-iterator在迭代协议中的作用

2次阅读

symbol.iterator 是 javascript 迭代协议的核心符号,使对象可被 for…of 等语法遍历;它必须返回符合迭代器协议的对象(含 next() 方法),返回 {value, done};数组等内置类型默认实现,普通对象需手动添加;可结合生成器函数简化实现;该属性不可枚举、不可配置,是语言识别可迭代性的唯一依据。

JavaScript中Symbol-iterator在迭代协议中的作用

Symbol.iterator 是 JavaScript 中实现迭代协议(iteration protocol)的核心符号,它让一个对象能被 for...of、扩展运算符[...obj])、解构赋值等语法识别为“可迭代对象”。

它定义了对象如何被遍历

每个具有 [Symbol.iterator] 方法的对象,都必须返回一个符合迭代器协议(iterator protocol)的对象,即包含 next() 方法的对象。该方法每次调用返回形如 { value, done } 的结果对象。

  • 如果没定义 Symbol.iterator,对象就不能用于 for...of,会报错 TypeError: xxx is not iterable
  • 数组、字符串map、Set 等内置类型已默认部署该方法,所以天然可迭代
  • 普通对象(Object)默认没有,因此 for...of 不能直接遍历普通对象的属性

手动添加 Symbol.iterator 实现自定义遍历逻辑

你可以为任意对象设置自己的 Symbol.iterator 方法,控制其遍历时的行为。例如,让一个类按特定顺序或条件逐个返回值:

class Countdown {   constructor(n) {     this.count = n;   }   [Symbol.iterator]() {     return {       next: () => {         if (this.count > 0) {           return { value: this.count--, done: false };         } else {           return { value: undefined, done: true };         }       }     };   } } <p>for (const num of new Countdown(3)) { console.log(num); // 输出 3, 2, 1 }

它与生成器函数天然契合

使用 function* 定义生成器函数,返回一个原生迭代器,非常适合作为 Symbol.iterator 的实现:

立即学习Java免费学习笔记(深入)”;

  • 简洁:无需手动管理 donevalue 状态
  • 支持 yield 暂停/恢复,适合异步或惰性计算场景
  • 示例:[Symbol.iterator]() { return this.values(); } 或直接 [Symbol.iterator]: function*() { yield* this.items; }

注意:Symbol.iterator 是不可枚举、不可配置的

通过 Object.getOwnPropertySymbols(obj) 可以获取,但不会出现在 for...inObject.keys() 中。它的存在是语言内部机制识别可迭代性的唯一依据,不是靠命名约定,而是靠这个唯一的 symbol 值匹配。

不复杂但容易忽略。

text=ZqhQzanResources