登录
首页 >  文章 >  前端

JavaScript迭代器是什么?如何配合for-of循环?

时间:2026-04-06 23:47:53 176浏览 收藏

JavaScript迭代器是一种遵循严格协议的对象,核心在于实现`next()`方法并返回`{value, done}`结构,而让任意对象支持`for-of`循环的关键则是正确提供`[Symbol.iterator]()`方法;它并非语法糖,而是连接语言遍历语法与数据结构的底层契约——理解其单向消耗性、状态隔离要求及常见陷阱(如`done`类型错误或闭包状态管理),才能真正掌握现代JS中可迭代性的本质与实践。

javascript迭代器是什么_它如何与for-of循环配合工作【教程】

JavaScript 迭代器不是语法糖,而是一个有明确接口约定的对象;它让任意对象支持 for-of 循环的关键,在于实现 [Symbol.iterator]() 方法并返回一个符合迭代器协议的对象。

迭代器对象必须满足什么结构?

一个合法的迭代器对象,必须有 next() 方法,且每次调用返回形如 { value: any, done: boolean } 的对象。其中:donetrue 表示遍历结束,value 是当前项(即使 done: truevalue 仍可存在,比如 return 值)。

常见错误现象:

  • 手动写的 next() 没返回对象 → TypeError: Iterator result undefined is not an object
  • done 忘记设为布尔值(比如写成字符串 "true")→ for-of 不停止
  • 多次调用 next() 后状态没推进(比如总返回第一个元素)→ 死循环

for-of 背后到底在调什么?

for-of 不是直接操作数组或字符串,而是先尝试调用目标对象的 [Symbol.iterator] 方法。如果没找到,就报错 TypeError: ... is not iterable;如果找到了,就反复调它的返回值的 next(),直到 done: true

实操要点:

  • 原生可迭代对象(ArrayStringMapSetTypedArray)都自带 [Symbol.iterator]
  • 普通对象默认不可迭代,加了 [Symbol.iterator](){ return {...} } 才能进 for-of
  • for-of 无法遍历类数组对象(如 argumentsNodeList)除非它们显式实现了迭代器协议

手写一个可被 for-of 消费的范围迭代器

下面这个 range 函数返回的对象,既能用 for-of 遍历,也能手动调 next()

function range(start, end) {
  return {
    [Symbol.iterator]() {
      let current = start;
      return {
        next() {
          if (current 
<p>注意点:</p>
  • [Symbol.iterator] 必须是函数,且每次调用都应返回**新**的迭代器对象(否则多个 for-of 共享状态会出错)
  • 上面例子中,next() 内部用闭包保存 current,保证每次迭代独立
  • 如果想支持无限迭代(如 range(0)),需自行控制终止逻辑,for-of 本身不提供中断机制

真正容易被忽略的是:迭代器协议是“单向消耗”的——一旦 next() 返回 { done: true },后续再调就该持续返回相同结果,不能重置。很多自定义迭代器忘了这点,导致重复遍历时行为异常。

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《JavaScript迭代器是什么?如何配合for-of循环?》文章吧,也可关注golang学习网公众号了解相关技术文章。

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