极简三分钟ES6 - 迭代器Iterator

定义迭代器

想象我们去图书馆借书,管理员(迭代器)按顺序从书架上取书给到我们

  • 我们不需要知道书架结构(数组、字符串、Map 等内部细节)
  • 只需说"下一本" (调用 next() 方法)
  • 管理员返回书和状态{ value: 书, done: 是否取完 }
js 复制代码
const books = ["📖JS指南", "📚CSS揭秘"];
const librarian = books[Symbol.iterator](); // 找管理员 
 
console.log(librarian.next());  // { value: "📖JS指南", done: false }
console.log(librarian.next());  // { value: "📚CSS揭秘", done: false }
console.log(librarian.next());  // { value: undefined, done: true }(书已取完)

为啥要迭代器

统一遍历方式

不同数据结构(数组、字符串、Map等)都通过相同的接口Symbol.iterator )提供迭代器,无需再记不同遍历方法

js 复制代码
// 数组、字符串、Set 都能用同一姿势遍历 
for (const item of [1, 2, 3]) { /*...*/ }     // 数组 
for (const char of "Hi") { /*...*/ }          // 字符串 
for (const entry of new Set([10, 20])) { /*...*/ } // Set 

按需取值,节省内存 迭代器懒加载 特性:只有调用 next() 时才计算下一个值,适合处理大规模数据(如日志文件)

那要怎么使用

  • 创建迭代器 :通过 [Symbol.iterator]() 方法获取

  • 遍历三步曲

    1. 调用 next()
    2. 返回 { value: 当前值, done: 是否结束 }
    3. done=true 则停止

ES6中哪些数据自带迭代器

数据类型 示例 遍历内容
数组 Array [1, 2] 元素值(1, 2)
字符串 String "AB" 字符("A", "B")
集合 Set new Set([10, 20]) 元素值(10, 20)
字典 Map new Map([["key", "value"]]) 键值对(["key", "value"])
类数组 arguments function fn() { for (x of arguments) } 函数参数值

迭代器 vs for...of 循环

  • 迭代器 :底层协议(next() 方法)
  • for...of :基于迭代器的语法糖,自动处理遍历
js 复制代码
// for...of 内部等效代码 
const it = books[Symbol.iterator]();
let result = it.next(); 
while (!result.done)  {
  const book = result.value; 
  console.log(book); 
  result = it.next(); 
}

牢记

迭代器如同数据世界的通用遥控器,让不同数据结构用相同方式访问,让处理大数据流变得高效,让复杂遍历变得简单可控

相关推荐
圆肖41 分钟前
[陇剑杯 2021]简单日志分析(问3)
前端·经验分享·github
王嘉俊9251 小时前
Django 入门:快速构建 Python Web 应用的强大框架
前端·后端·python·django·web·开发·入门
IT_陈寒2 小时前
Redis性能翻倍的5个冷门技巧,90%的开发者从不知道第3点!
前端·人工智能·后端
WebGIS开发2 小时前
新中地三维GIS开发智慧城市效果和应用场景
前端·人工智能·gis·智慧城市·webgis
課代表3 小时前
Acrobat DC 文本域表单验证中的 js 使用
javascript·正则表达式·表单验证·数据完整性·字段验证·事件对象·自定义验证
鱼樱前端3 小时前
uni-app快速入门章法(一)
前端·uni-app
zhangxuyu11183 小时前
flex布局学习记录
前端·css·学习
掘金一周3 小时前
🍏让前端去做 iPhone 的液态玻璃❓ | 掘金一周 10.2
前端·人工智能·后端
用户6387994773053 小时前
Next.js 多语言对决:next-intl vs next-i18next vs Intlayer
javascript
Keepreal4963 小时前
谈谈对javascript原型链的理解以及原型链的作用
前端·javascript