登录
首页 >  文章 >  前端

Symbol.iterator在迭代中的作用与使用方法

时间:2026-04-30 19:50:30 417浏览 收藏

Symbol.iterator 是 ES6 引入的核心机制,作为可迭代协议的“钥匙”,它让任意对象能通过自定义 [Symbol.iterator] 方法获得 for...of、扩展运算符、解构赋值等原生迭代语法的支持;只需返回一个具备 next() 方法的迭代器对象(每次调用返回 {value, done}),就能轻松实现如数字区间、自定义集合等数据结构的优雅遍历——掌握它,你就掌握了 JavaScript 迭代行为的控制权。

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

Symbol.iterator 是 JavaScript 中实现自定义迭代行为的核心机制,它让对象能被 for...of、扩展运算符(...)、解构赋值等原生迭代语法识别和消费。

什么是 Symbol.iterator?

它是 ES6 引入的一个内置 symbol 值,作为对象的属性键使用。当一个对象拥有该属性且其值是一个返回迭代器对象的函数时,该对象就符合可迭代协议(iterable protocol)。

浏览器和引擎在遇到迭代语法时,会自动查找对象的 [Symbol.iterator] 方法并调用它,获取迭代器来逐个取出值。

如何手动实现一个可迭代对象?

只需在对象上定义 [Symbol.iterator] 方法,返回一个符合迭代器协议的对象(即有 next() 方法,返回 { value, done } 形式的对象):

  • 定义一个类或普通对象,添加 [Symbol.iterator]() 方法
  • 该方法必须返回一个对象,该对象有 next() 方法
  • next() 每次调用应返回 { value: 当前值, done: 是否结束 }

例如,让一个数字范围对象可迭代:

class Range {
  constructor(start, end) {
    this.start = start;
    this.end = end;
  }
  [Symbol.iterator]() {
    let current = this.start;
    return {
      next: () => {
        if (current 

常见内置类型为何能被 for...of 遍历?

因为它们原生实现了 [Symbol.iterator]

  • Array:按索引顺序返回元素
  • String:按 UTF-16 码元(非单个 Unicode 字符)逐个返回
  • Map / Set:分别按插入顺序返回键值对或值
  • TypedArray:按数组索引顺序返回数值

可通过 Array.prototype[Symbol.iterator] 查看其函数体,或直接调用验证:

const arr = [1, 2, 3];
const it = arr[Symbol.iterator]();
console.log(it.next()); // { value: 1, done: false }

注意事项与陷阱

Symbol.iterator 只影响迭代行为,不改变对象本身结构或原型链:

  • 每次调用 [Symbol.iterator] 应返回**新迭代器**,避免多个遍历互相干扰
  • 迭代器是**一次性消耗品**:一旦 done: true,后续 next() 仍应返回 { value: undefined, done: true }
  • 若未实现或返回非函数,for...of 会抛出 TypeError: is not iterable
  • 不能用 typeof obj[Symbol.iterator] === 'function' 完全替代可迭代性判断——还需确保调用后返回合法迭代器

不复杂但容易忽略。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

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