Iterator迭代器和Generator生成器

news2024/9/20 17:59:56

Iterator迭代器和for/of循环原理

Iterator迭代器规范

在这里插入图片描述

自己创建一个Iterator类,来实现ES6中的迭代器规范:

class Iterator {
   
    constructor(assemble) {
   
        // assemble:需要迭代的数据结构
        this.assemble = assemble
        // index:记录迭代的次数(或者索引)
        this.index = -1
    }
    // 必须具备next方法
    next() {
   
        this.index++
        let {
    assemble, index } = this
        if (index >= assemble.length) {
   
            // 迭代完毕
            return {
   
                done: true,
                value: undefined
            }
        }
        return {
   
            done: false,
            value: assemble[index]
        }
    }
}

创建一个实例对象,其应该符合迭代器规范的要求:

  • itor.next() 具备next方法,执行这个方法可以依次遍历数据结构中的每一个成员
  • 每一次遍历返回的结果是一个对象 {done:false,value:xxx}
    • done: 是否迭代完毕
    • value: 当前获取的成员值

符合以上两个特点的对象,我们称之为符合迭代器规范的对象

let arr = [10, 20, 30, 40],
    itor = new Iterator(arr)
console.log(itor.next()) // {done: false, value: 10}
console.log(itor.next()) // {done: false, value: 20}
console.log(itor.next()) // {done: false, value: 30}
console.log(itor.next()) // {done: false, value: 40}
console.log(itor.next()) // {done: true, value: undefined}

在JS中,有很多数据结构,天生具备迭代器规范,例如:
        我们主要看数据结构(对象)是否具备 Symbol.iterator 这个属性;有这个属性就具备迭代器规范,没有就不具备;具备这个规范,就可以使用 for/of 循环来迭代数据中的每一项值了。

  • 数组 Array.prototype[Symbol(Symbol.iterator)]=function…
  • 部分类数组:
    • arguments[Symbol(Symbol.iterator)]
    • NodeList.prototype[Symbol(Symbol.iterator)] document.querySelectorAll('*')
    • HTMLCollection.prototype[Symbol(Symbol.iterator)] document.getElementsByTagName('*')
  • 字符串 String.prototype[Symbol(Symbol.iterator)]
  • Set/Map

但是对于纯粹对象「或者自己构建的类数组对象(以数字作为索引,索引从0开始逐级递增,有length属性表示长度)」等来讲,默认是不具备 Symbol.iterator 这个属性的,所以他们不具备迭代器规范「不能直接使用 for/of 循环」

for/of循环原理

重写数组迭代器规范(数组有内置的迭代器规范)来说明原理:

// 数组迭代的方式 for、while、forEach/map、for/in、for/of...
let array = [10, 20, 30, 40]
array[Symbol.iterator] = function () {
   
    console.log('for/of Start');
    let self = this,// this->array
        index = -1
    // 返回具备迭代器规范的对象->itorr
    return {
   
        next() {
   
            index += 2
            if (index >= self.length) {
   
                return {
   
                    done: true,
                    value: undefined
                }
            }
            return {
   
                done: false,
                value: self[index]
            }
        }
    }
}
// let itorr = array[Symbol.iterator]()
for (let val of array) {
   
    console.log(val);
}

在这里插入图片描述

// for/of循环主要用于获取数据结构中每一项的‘值’
for (let val of array) {
    console.log(val);
}

原理:
1.迭代执行,先执行数组的 Symbol.iterator 这个方法,获取一个具备迭代器规范的对象 -> itor
2.开始迭代:每一次迭代都是把 itor.next 方法执行

  • 把获取对象中的value属性值,赋值给val这个变量
  • 再看对象中done这个属性的值,如果是false,则继续迭代;如果是true,则结束迭代

普通对象是不具备迭代器规范的:

let obj = {
   
    name: '52lkk',
    age: 24,
    0: 100,
    [Symbol('AA')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/821911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

excle中的条件求和SUMIF

问题:将每一行中红色文字的前一个值累计求和到境外总数这一列 使用的公式 自制单元格的格式计算公式:ctrlf3打开格式管理,创建如下公式,其中24是表示获取文字颜色 由于sumif只能直接与第二参数条件比较,所以先使用IF(公…

LoVT:医学图像与报告的局部表征联合学习

论文:https://arxiv.org/abs/2112.02889 Github:GitHub - philip-mueller/lovt: Localized representation learning from Vision and Text (LoVT) 摘要 摘要对比学习已被证明对未标记数据的预训练图像模型是有效的,在医学图像分类等任务中…

算法专题:子序列系列1

文章目录 单个序列问题示例1:最长递增子序列(不连续)思路DP数组含义递推公式初始化遍历顺序 完整版注意返回值问题 区分示例1:最长递增子数组区别:递推公式 示例2:最长连续递增序列(连续&#x…

【LeetCode】不同路径Ⅱ

不同路径Ⅱ 题目描述算法流程编程代码 链接: 不同路径Ⅱ 题目描述 算法流程 编程代码 class Solution { public:int uniquePathsWithObstacles(vector<vector<int>>& ob) {int m ob.size();int n ob[0].size();vector<vector<int>>dp(m1,vecto…

LabVIEW 开发在不确定路况下自动速度辅助系统

LabVIEW 开发在不确定路况下自动速度辅助系统 智能驾驶辅助系统是汽车行业最先进的升级和尖端技术&#xff0c;智能交通系统依靠智能驾驶辅助系统在公共交通部门工作。该智能驾驶辅助系统技术包括自适应巡航控制&#xff0c;防抱死制动系统&#xff0c;安全气囊展开&#xff0…

C# 中使用ValueTask优化异步方法

概要 我们在开发过程中&#xff0c;经常使用async的异步方法&#xff0c;但是有些时候&#xff0c;异步的方法中&#xff0c;可能包含一些同步的处理。本文主要介绍通过ValueTask这个struct&#xff0c;优化异步处理的方法性能。 代码及实现 有些时候我们会缓存一些数据在内…

【java线上监控】Arthas由菜鸟到菜鸡

目录 1 arthas介绍 1.1 简介 1.2 背景 1.3 Arthas&#xff08;阿尔萨斯&#xff09;能为你做什么&#xff1f; 2 window环境搭建 2.1 下载和启动 2.1 启动后&#xff1a;选择需要监控的服务 3 快速入门 3.1 打开浏览器 3.2 开启trace请求 3.3 查看 dashboard 3.6.…

UE虚幻引擎 UTextBlock UMG文本控件超过边界区域以后显示省略号

版本 5.2.1 裁剪 - 剪切 - 剪切到边界 裁剪 - 高级 - 溢出策略 - 省略

消息触达平台 - 基础理论

目录 消息触达平台 背景 业务流程 触达配置 服务处理 表现展示 效果统计 触达信息结构 对象 内容 渠道 场景 机制 消息触达平台 背景 在产品生命周期的不同阶段&#xff0c;用户触达体系可以用来对不同用户群体进行定制化运营。结合咱们的日常场景&#xff0c;公司的运营同学或…

数据结构——单链表OJ题

单链表OJ题 前言一、删除链表中等于给定值 val 的所有节点二、反转一个单链表三、返回链表的中间结点四、输出该链表中倒数第k个结点五、将两个有序链表合并六、链表的回文结构七、将链表分割成两部分八、找出第一个公共结点九、判断链表中是否有环总结 前言 在前面的博客中我…

13-4_Qt 5.9 C++开发指南_基于QWaitCondition 的线程同步_Wait

在多线程的程序中&#xff0c;多个线程之间的同步实际上就是它们之间的协调问题。例如上一小节讲到的3个线程的例子中&#xff0c;假设 threadDAQ 写满一个缓冲区之后&#xff0c;threadShow 和 threadSaveFile 才能对缓冲区进行读操作。前面采用的互斥量和基于 OReadWriteLock…

【calc】需要使用新应用以打开此ms-calculator链接

问题出现 win10系统&#xff0c;winr输入calc调用计算器时候出现 需要使用新应用以打开此ms-calculator 链接 解决操作 左下角右键单击->Windows Powershell(管理员) # 先执行恢复商店 Get-AppXPackage *WindowsStore* -AllUsers | Foreach {Add-AppxPackage -Disable…

根据URL批量下载文件并压缩成zip文件

根据url批量下载图片或者视频&#xff0c;只需要将图片的url和名称放到数组对象即可&#xff0c;例如&#xff1a; let fileArr [{fvUrl:https://image.xuboren.com/image/2023/07/26/1410829074764cdbaa4314a084eb749e.jpg,fvName: 图片名称},{fvUrl:https://image.xuboren.…

雷柏VT350S反馈更敏捷,PC玩家不可或缺的游戏利器

FPS还有MOBA游戏是很多PC玩家的最爱道&#xff0c;一款好的鼠标可以让我们在游戏中更加得心应手&#xff0c;关键时刻甚至能逆转乾坤。以前&#xff0c;有线鼠标总是让人觉得不够自由&#xff0c;无线鼠标又担心延迟和续航。现在新款的无线鼠标终于能够做到超低延迟了&#xff…

uniapp 实现滑动元素并下方有滚动条显示

用uniapp实现下图的样式 代码如下&#xff1a; <template><view class"content"><view class"data-box" ref"dataBox" touchend"handleEnd"><view class"data-list"><view class"data-ite…

【黑马程序员前端】JavaScript入门到精通--20230801

B站链接 HTML相关知识【黑马程序员前端】 https://blog.csdn.net/m0_48964052/article/details/125951658 CSS相关知识【黑马程序员前端】 https://blog.csdn.net/m0_48964052/article/details/125951788 黑马程序员——JavaScript基础1&#xff08;初识 JavaScript&…

算法通关村第二关——反转链表白银笔记

文章目录 1.链表指定区间翻转2.两两交换链表中的节点 1.链表指定区间翻转 LeetCode 92.反转链表 解法一&#xff1a;头插法。利用虚拟节点进行反转&#xff0c;因为头节点有可能发生变化&#xff0c;比如 left1 那么需要 dummyNode.next 记录头结点&#xff0c;使用虚拟头节点…

【PostgreSQL】系列之 一 schema详解(二)

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

保留网络:大型语言模型的Transformer继任者

原文信息 原文题目&#xff1a;《Retentive Network: A Successor to Transformer for Large Language Models》 原文引用&#xff1a;Sun Y, Dong L, Huang S, et al. Retentive Network: A Successor to Transformer for Large Language Models[J]. arXiv preprint arXiv:2…