当前位置: 首页 > news >正文

Symbol.iterator 详解

Symbol.iterator 是 JavaScript 中的一个内置符号(Well-known Symbol),用于定义对象的默认迭代器。它是实现 JavaScript 可迭代协议(Iterable Protocol) 的核心机制。以下是关键要点:

核心概念

  1. 作用:
    • 使对象成为可迭代对象(Iterable),即可被 for…of 循环、展开运算符 …、Array.from() 等消费
    • 提供一种标准化的方式来自定义对象的迭代行为
  2. 迭代器协议:
    • 对象必须实现 [Symbol.iterator] 方法
    • 该方法返回一个迭代器对象(包含 next() 方法的对象)
    • next() 方法返回包含两个属性的对象:
      • value:当前迭代值
      • done:布尔值,表示迭代是否完成

示例代码

// 自定义可迭代对象
const countdown = {start: 3,[Symbol.iterator]() { // 定义迭代器方法let count = this.start;return {next() {if (count >= 0) {return { value: count--, done: false };}return { done: true }; // 结束迭代}};}
};// 使用场景
// 1. for...of 循环
for (const num of countdown) {console.log(num); // 输出:3, 2, 1, 0
}// 2. 展开运算符
console.log([...countdown]); // 输出:[3, 2, 1, 0]// 3. 使用生成器简化
const countdownGenerator = {*[Symbol.iterator]() {for (let i = this.start; i >= 0; i--) yield i;},start: 3
};

内置可迭代对象

JavaScript 原生支持的可迭代对象:

// 数组
console.log([1, 2][Symbol.iterator]().next()); // { value: 1, done: false }// 字符串
for (const char of "Hi") console.log(char); // "H", "i"// Map/Set
new Map([["key", "value"]]).keys() // 返回迭代器

关键特性

  1. 协议要求:
const iterator = obj[Symbol.iterator]();
let result = iterator.next();
while (!result.done) {console.log(result.value);result = iterator.next();
}
  1. 自动调用场景:
    • for…of 循环
    • […obj] / Array.from(obj)
    • new Map([iterable])
    • Promise.all(iterable)
    • yield* 表达式
  2. 错误处理:
    • 若对象未实现 [Symbol.iterator],调用相关操作会抛出:
TypeError: obj is not iterable

使用场景

  1. 自定义数据结构迭代(链表/树)
  2. 惰性计算(无限序列)
const infiniteNumbers = {[Symbol.iterator]() {let n = 0;return {next: () => ({ value: n++, done: false })};}
};
  1. 封装非迭代数据源(如文件流)

重要提示:Symbol.iterator 是 ECMAScript 2015 (ES6) 引入的标准特性,现代浏览器和 Node.js 环境均支持,但需注意旧环境兼容性问题(可通过 Babel 等工具解决)。

http://www.lqws.cn/news/449335.html

相关文章:

  • 《被讨厌的勇气》详细概述
  • 【大数据】java API 进行集群间distCP 报错unresolvedAddressException
  • vue3打包后,图片丢失
  • 【unity游戏开发——热更新】什么是Unity热更新
  • 【精选】基于SpringBoot的宠物互助服务小程序平台开发 微信小程序宠物互助系统 宠物互助小程序平台设计与实现 支持救助发布+领养申请+交流互动功能
  • 无人机不再“盲飞”!用Python搞定实时目标识别与跟踪
  • 【Linux驱动开发 ---- 4.2_平台设备(Platform Devices)概述】
  • 1.容器技术与docker环境部署
  • phpstudy无法启动mysql,一启动就关闭,完美解决
  • PLuTo 编译器示例9-12
  • 从生活场景学透 JavaScript 原型与原型链
  • 力扣-62.不同路径
  • 【MySQL篇08】:undo log日志和MVCC实现事务隔离
  • 【小程序】如何生成特定页面的小程序码
  • apifox接收流式响应无法自动合并json内容
  • 组态王工程运行时间显示
  • 数据库从零开始:MySQL 中的 DDL 库操作详解【Linux版】
  • 大话软工笔记—业务功能分类
  • 青少年编程与数学 01-012 通用应用软件简介 03 图像处理软件
  • VR 看房:突破成长痛点,展望未来趋势
  • OPENGLPG第九版学习 - 纹理与帧缓存 part1
  • 【笔记】解决部署国产AI Agent 开源项目 MiniMax-M1时 Hugging Face 模型下载缓存占满 C 盘问题:更改缓存位置全流程
  • 【Python进阶系列】第10篇:Python 项目的结构设计与目录规范 —— 从脚本到模块,从混乱到整洁
  • Flutter Hero 组件详解及应用
  • 定位接口偶发超时的实战分析:iOS抓包流程的完整复现
  • dify本地部署及添加ollama模型(ubuntu24.04)
  • wsl2 ubuntu22 安装 systemd
  • GitHub 趋势日报 (2025年06月19日)
  • 学习路之uniapp--uniapp扩展uni-ui
  • SP-VLA:一种用于 VLA 模型加速的联合模型调度和 token 剪枝方法