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

Iterator迭代器 【ES6】

学无止境

目录

  • Iterator是什么?
  • Iterator作用:
  • 遍历过程:
  • 深入剖析:
    • 哪些数据结构自带 Symbol.iterator?
    • 为什么普通对象不能 for...of?
    • 让对象变成可迭代的:
    • 结论:
    • 简单构造迭代器的方法:

Iterator是什么?

在前端开发中,迭代器(Iterator) 是一种用于遍历数据集合的接口。迭代器提供了一种统一的方式来访问集合中的元素,而无需暴露集合的内部结构。

Iterator作用:

引言:需要遍历的每个值 数组可以通过for循环-索引值找到;对象可以通过for-in找到;那么Set呢?Map呢?要通过什么方式能找到? 由于数据结构太多,所以:

  • 为各种数据结构提供一个统一的、简便的访问接口
  • 是的数据结构的成员能够按某种次序排列
  • for…of循环(ES6新创的遍历命令;Iterator主要用for…of循环)

遍历过程:

  1. 创建一个指针对象,指向当前数据结构的起始位置
  2. 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员
  3. 第二次调用指针对象的next方法,指针指向数据结构的第二个成员
  4. 不断调用只针对想的next方法,直到它指向数据结构的结束位置
const array = [1, 2, 3, 4, 5];
// 获取数组的迭代器
const iterator = array[Symbol.iterator]();
// 使用迭代器遍历数组
let result = iterator.next();
while (!result.done) {console.log(result.value);result = iterator.next();
}

结果如下:
在这里插入图片描述

深入剖析:

哪些数据结构自带 Symbol.iterator?

ES6规定,默认的Iterator接口部署在数据结构的Symbol.iterator属性(一个数据结构只要有Symbol.iterator属性,就可以认为是可遍历的)

数据类型是否可迭代示例
Array✅ 有[1,2,3][Symbol.iterator]()
String✅ 有"abc"[Symbol.iterator]()
Map✅ 有new Map()[Symbol.iterator]()
Set✅ 有new Set()[Symbol.iterator]()
TypedArray(如 Int8Array)✅ 有new Int8Array()[Symbol.iterator]()
Arguments(类数组对象 Array-like Object)✅ 有function fn(){ arguments[Symbol.iterator]() }
DOM NodeList(节点集合,类数组)✅ 有document.querySelectorAll('div')[Symbol.iterator]()
Object(普通对象)❌ 默认没有{a:1}[Symbol.iterator] // undefined

为什么普通对象不能 for…of?

因为它 没有实现 Symbol.iterator。【对象是非线性的

const obj = { a: 1, b: 2 };for (const x of obj) {   // ❌ TypeError: obj is not iterableconsole.log(x);
}console.log(obj[Symbol.iterator]); // undefined

让对象变成可迭代的:

加一个 Symbol.iterator 方法:

const obj = {a: 1,b: 2,[Symbol.iterator]() {const entries = Object.entries(this)let index = 0return {next() {if (index < entries.length) {return { value: entries[index++], done: false }} else {return { done: true }}}}}
}for (const [k, v] of obj) {console.log(k, v); // a 1 / b 2
}
let obj = {code:200,name:'obj',list:['a','b','c'],[Symbol.iterator](){let index = 0;return {next:()=>{if(index<this.list.length){return {done:false,value:this.list[index++]}}else{return {done:true,value:null}}}}}
}for(let item of obj){console.log(item); // a <br/> b <br/> c
}

结论:

只要一个对象拥有 obj[Symbol.iterator]() 方法,它就是一个“可迭代对象”,可以被 for...of、… 等语法使用。

简单构造迭代器的方法:

function getIterator(list) {let i = 0;return {next: function () {let done = (i >= list.length);let value = done ? undefined : list[i++];return {value: value,done: done};}};
}
const arr = getIterator(['a', 'b', 'c']);
console.log(arr.next());// {value: "a", done: false}
console.log(arr.next());// {value: "b", done: false}
console.log(arr.next());// {value: "c", done: false}
console.log(arr.next());// "{ value: undefined, done: true }"

在这里插入图片描述

http://www.dtcms.com/a/490985.html

相关文章:

  • spring boot实现接口数据脱敏,整合jackson实现敏感信息隐藏脱敏
  • 基于单片机的汽车多参数安全检测与报警系统设计
  • C++设计模式_行为型模式_备忘录模式Memento
  • 温州h5建站关于网站建设的文章
  • 大连专业做网站wordpress 4.5 汉化主题
  • Spring Boot 3零基础教程,Spring Boot 日志分组,笔记20
  • 【单调向量 单调栈】3676. 碗子数组的数目|1848
  • 【JUnit实战3_01】第一章:JUnit 起步
  • 公司门户网站该怎么做用模块做网站
  • 合肥网站定制公司宁波做网站公司哪家好
  • Banana Script,一个C99实现的,类JavaScript极简语法的脚本引擎
  • 14-机器学习与大模型开发数学教程-第1章 1-6 费马定理与极值判定
  • 写的网站怎么做接口php在网站上怎么做充值
  • nginx报400bad request 请求头过大异常处理
  • react+springboot云上部署
  • Google 地图类型
  • 免费网站做企业的网站都要准备什么
  • 网站建设往年的高考题免费看电视的网站有哪些
  • STM32N6 KEIL IDE 调试XIP 应用的一种方法 LAT1575
  • 大模型微调(二):使微调保持稳定的策略
  • 前端调优23大规则(Part 4)
  • SpringBoot-入门介绍
  • 如何推动AI技术在企业管理中的商业化落地?
  • 淘宝网站建设的策划书产品软文案例
  • 复制带随机指针的链表
  • Promise 与 async/await
  • win11 字体变宽问题
  • 最好的做网站机械加工网站色彩搭配
  • Pytorch Yolov11目标检测+Android部署 留贴记录
  • iis 发布网站 404archlinux+wordpress