讲师中心 微信公众号
AI工具推荐 视频效率加速

javascript中什么是迭代器_它如何工作【教程】

小涛吖_6261

小涛吖_6261

发布时间:2026-01-28 14:30:25

|

371人浏览过

|

来源于php中文网

原创

Symbol.iterator 是对象可被 for...of 遍历的必要条件,其返回值必须是含 next() 方法的迭代器,且 next() 每次调用须返回 { value, done };常见错误包括缺失 done、this 未实现 next、箭头函数导致 this 绑定失效;Range 类需确保 [Symbol.iterator] 是普通函数、每次返回新迭代器、done 为 true 后仍稳定返回 { done: true }。

javascript中什么是迭代器_它如何工作【教程】

Symbol.iterator 是让对象能被 for...of 遍历的“通行证”,而迭代器本身是一个带 next() 方法的对象,每次调用返回 { value, done } —— 它不是语法糖,是 JavaScript 遍历行为的底层契约。

为什么 for...of 会报 “is not iterable”?

因为目标对象没提供 [Symbol.iterator] 方法,或者该方法没返回一个合法迭代器(即没有 next(),或 next() 不返回 { value, done })。常见错误包括:

  • 直接把 { next() { return { value: 1 } } } 当作可迭代对象 —— ❌ 缺少 done,for...of 会无限循环
  • 写了 [Symbol.iterator]() { return this; },但 this 没实现 next() —— ❌ 对象自身不是迭代器
  • 在类中定义 [Symbol.iterator] 时用了箭头函数 —— ❌ 箭头函数无法正确绑定 this,状态变量会共享或丢失

手写一个可遍历的 Range 类要注意什么?

它要同时满足两个角色:可迭代对象(有 [Symbol.iterator])和迭代器生成器(返回的迭代器要有状态、可暂停)。关键点:

  • [Symbol.iterator] 必须是普通函数(非箭头),才能闭包捕获当前遍历位置
  • 每次调用该方法都应返回**新迭代器**,否则多个 for...of 循环会互相干扰
  • done: true 后,后续 next() 仍需返回 { done: true }(value 可省略),不能抛错或返回 undefined
class Range {
  constructor(start, end) {
    this.start = start;
    this.end = end;
  }
  [Symbol.iterator]() {
    let i = this.start;
    return {
      next() {
        if (i <= this.end) {
          return { value: i++, done: false };
        }
        return { done: true }; // ✅ 显式结束
      }
    };
  }
}

用 function* 实现迭代器更安全,但别误以为它“自动可遍历”

生成器函数返回的是生成器对象,它**既是迭代器,也是可迭代对象**([Symbol.iterator] === self),所以可以直接 for...of。但它不是万能解药:

  • 生成器函数内部不能用 await(除非用 async function* → 异步迭代器)
  • 一旦执行过 next() 并走到 done: true,再调用 next() 仍返回 { done: true },无法重置 —— 和手动迭代器一样,“一次性”是硬约束
  • 生成器对象不支持随机访问(比如想跳到第 5 个元素),只能顺序推进

自定义树结构怎么加 for...of 支持?

核心不是“让树变数组”,而是让遍历逻辑(如中序)变成按需生成的流程。重点在于:[Symbol.iterator] 返回的迭代器必须封装好遍历状态,而不是当场执行全部遍历。

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

  • 不要在 [Symbol.iterator] 里递归遍历完所有节点再返回数组 —— 这就失去“懒求值”意义,也违背迭代器本意
  • 推荐用栈模拟递归(中序/前序)或用生成器 yield* 委托子树,天然保持暂停能力
  • 如果树很大且只读前几个节点,手动迭代器 + 栈方式比生成器内存更可控(无函数调用栈累积)
真正容易被忽略的是:迭代器协议不关心数据“在哪”或“怎么来”,只规定“怎么取”。哪怕 value 是异步 fetch 来的、是实时传感器读数、甚至是无限序列(如斐波那契),只要 next() 每次返回符合协议的对象,它就能被标准语法消费——这个抽象层级,才是它不可替代的地方。

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5847

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2508

2023.08.10

go语言闭包相关教程大全
go语言闭包相关教程大全

本专题整合了go语言闭包相关数据,阅读专题下面的文章了解更多相关内容。

4353

2025.07.29

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

11965

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

5507

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

2516

2025.12.25

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

3120

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

514

2023.10.07

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

100

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.2万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn