0

0

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

夜晨

夜晨

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

|

311人浏览过

|

来源于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 } } } 当作可迭代对象 —— ❌ 缺少 donefor...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。但它不是万能解药:

Getimg.ai
Getimg.ai

getimg.ai是一套神奇的ai工具。生成大规模的原始图像

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

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

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

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

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

396

2023.07.18

堆和栈区别
堆和栈区别

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

575

2023.08.10

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

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

137

2025.07.29

undefined是什么
undefined是什么

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

5366

2023.07.31

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

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

3084

2024.08.14

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

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

559

2025.12.25

function是什么
function是什么

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

482

2023.08.04

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

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

163

2023.10.07

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4.2万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号