登录
首页 >  文章 >  前端

Symbol.iterator在迭代协议中的作用是定义对象的默认迭代器,使对象可以被for...of循环等迭代结构使用。

时间:2026-04-04 15:48:23 252浏览 收藏

Symbol.iterator 是 JavaScript 迭代协议的基石,它以不可枚举、不可配置的唯一符号身份,精准定义对象如何被 for...of、扩展运算符、解构赋值等现代语法识别和遍历;内置类型如数组、字符串已原生支持,而普通对象可通过手动实现或更简洁的生成器函数(function*)赋予自定义迭代行为——掌握它,你就能让任意数据结构优雅融入 JavaScript 的迭代生态,解锁惰性计算、条件遍历与语义化遍历的无限可能。

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
}</p>

它与生成器函数天然契合

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

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

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

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

不复杂但容易忽略。

好了,本文到此结束,带大家了解了《Symbol.iterator在迭代协议中的作用是定义对象的默认迭代器,使对象可以被for...of循环等迭代结构使用。》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

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