让集合数据操控指尖舞动:迭代器和生成器的精妙之处

news2024/12/28 21:47:08

在这里插入图片描述

文章目录

  • 💙迭代器(Iterator)
        • 迭代器的特点:
        • 迭代器的优点:
        • 代码案例:
  • 💚生成器(Generator)
        • 生成器的特点:
        • 生成器的优点:
        • 代码案例:
  • 💜生成器函数创建迭代器

迭代器(Iterator)和生成器(Generator)是 JavaScript 中用于处理集合数据的重要概念

💙迭代器(Iterator)

  • 迭代器是一种对象,提供了一种顺序访问集合中元素的方法。
  • 迭代器对象必须包含一个 next() 方法,该方法返回一个包含 valuedone 属性的对象。
  • value 表示当前迭代的值,done 表示是否已经迭代完毕。
  • 使用迭代器可以通过显式地调用 next() 方法来遍历集合的元素。

当谈到迭代器时,我们通常指的是 JavaScript 中的迭代器。
下面我将详细介绍迭代器的特点、优点,并提供一个代码案例来说明其用法。

迭代器的特点:

  1. 提供遍历集合元素的统一接口:迭代器为各种不同类型的集合提供了一种统一的方式来访问和遍历集合中的元素。
  2. 惰性计算:迭代器支持惰性计算,在需要的时候才会产生新的值,这样可以减少内存占用和计算量。
  3. 可以自定义迭代逻辑:通过编写自定义的迭代器,我们可以控制迭代的顺序、逻辑和条件,实现灵活的迭代操作。

迭代器的优点:

  1. 简化集合数据的处理:使用迭代器可以简化集合数据的处理逻辑,使代码更加清晰和易于维护。
  2. 节省内存占用:迭代器支持按需获取集合的元素,避免一次性加载所有数据,从而节省内存占用。
  3. 惰性计算带来的性能优势:通过惰性计算,只有在需要时才会进行计算操作,从而提高效率。

代码案例:

下面是一个使用迭代器遍历数组的简单代码示例:

// 定义一个自定义迭代器
function createIterator(array) {
  let index = 0;

  return {
    next: function() {
      return index < array.length ?
        { value: array[index++], done: false } :
        { value: undefined, done: true };
    }
  };
}

// 创建一个迭代器对象
const iterator = createIterator([1, 2, 3, 4, 5]);

// 使用迭代器遍历数组
let result = iterator.next();
while (!result.done) {
  console.log(result.value);
  result = iterator.next();
}

在上面的示例中,我们首先定义了一个自定义迭代器函数 createIterator,该函数接受一个数组作为参数,并返回一个包含 next() 方法的对象。next() 方法用于返回迭代器的下一个值,并更新索引。

然后,我们使用 createIterator 创建了一个迭代器对象 iterator,并将一个数组 [1, 2, 3, 4, 5] 作为参数传递给它。

最后,我们使用 while 循环和迭代器对象来遍历数组元素。每次调用迭代器的 next() 方法都会返回一个包含 valuedone 属性的对象,我们可以通过 value 获取当前迭代的值,通过 done 判断是否已经遍历完所有元素。

通过这个简单的例子,你可以看到迭代器的工作原理和用法。迭代器提供了一种便捷的方式来遍历集合数据,使处理集合变得更加简单和灵活。

💚生成器(Generator)

  • 生成器是一种特殊的函数,可以用于定义迭代器对象。
  • 生成器函数使用 function* 关键字定义,内部使用 yield 关键字来产生值。
  • 调用生成器函数并不会立即执行函数体,而是返回一个迭代器对象。
  • 每次调用迭代器的 next() 方法时,生成器函数会从上一次暂停的地方继续执行,直到遇到下一个 yield 语句或函数结束。

生成器是一种用于创建迭代器的特殊函数。它具有独特的特点和优点。
下面我将详细介绍生成器的特点、优点,并提供一个代码案例来说明其用法。

生成器的特点:

  1. 定义简洁:生成器使用 function* 关键字定义,相比普通函数更加简洁。
  2. 惰性计算:生成器函数通过 yield 关键字可以多次产生值,每次调用 yield 语句后会暂停执行,并返回一个生成的值,下次再次调用时会从暂停的位置继续执行。
  3. 可以无限产生值:生成器函数可以无限次地产生值,因为它的执行过程是可恢复的,每次调用 yield 都会返回一个新的值,这使得生成器非常适合处理大型或无限序列的数据。
  4. 支持双向通信:除了通过 yield 产生值,生成器函数还可以通过 yield 接收外部发送的值。即可以作为迭代器的输出,也可以作为迭代器的输入。

生成器的优点:

  1. 简化迭代器的创建:生成器提供了一种更简单便捷的方式来创建迭代器,避免了手动编写迭代器对象的繁琐过程。
  2. 减少内存占用:生成器函数通过惰性计算和生成值的方式,可以避免一次性加载所有数据,从而减少内存占用。
  3. 更高的可读性和可维护性:生成器函数使用 yield 关键字表达迭代逻辑,使得代码更加清晰、易于理解和维护。

代码案例:

下面是一个使用生成器函数创建迭代器的示例代码:

function* fibonacci() {
  let prev = 0;
  let curr = 1;

  while (true) {
    yield curr;
    [prev, curr] = [curr, prev + curr];
  }
}

const iterator = fibonacci();

// 打印斐波那契数列的前10个值
for (let i = 0; i < 10; i++) {
  console.log(iterator.next().value);
}

在上面的示例中,我们定义了一个生成器函数 fibonacci 来生成斐波那契数列。在生成器函数中,我们使用 yield 关键字产生当前的斐波那契数,并在每次迭代后更新 prevcurr 变量的值。

然后,我们通过调用 fibonacci 函数创建了一个生成器对象 iterator

最后,我们使用 for 循环和迭代器对象来遍历斐波那契数列的前十个值。每次调用迭代器的 next() 方法都会返回一个包含 valuedone 属性的对象,我们可以通过 value 获取当前生成的斐波那契数。

通过这个简单的例子,你可以看到生成器的工作原理和用法。生成器函数提供了一种简洁、灵活和可维护的方式来创建迭代器,使得处理大型或无限序列的数据变得更加方便和高效。

💜生成器函数创建迭代器

下面是一个简单的示例,演示了使用生成器函数创建迭代器的过程:

function* myGenerator() {
  yield 'Hello';
  yield 'World';
}

const iterator = myGenerator(); // 调用生成器函数返回迭代器对象

console.log(iterator.next()); // { value: 'Hello', done: false }
console.log(iterator.next()); // { value: 'World', done: false }
console.log(iterator.next()); // { value: undefined, done: true }

在上面的示例中,myGenerator() 是一个生成器函数,通过 yield 关键字产生了两个值。调用 myGenerator() 函数返回一个迭代器对象 iterator。然后,我们可以使用 next() 方法逐个获取生成器中的值。

生成器和迭代器的结合使得处理集合数据变得更加方便和灵活。你可以使用迭代器手动控制迭代过程,也可以在需要时使用生成器函数来简化迭代器的创建和使用。

需要注意的是,在较新的 JavaScript 版本(如 ECMAScript 2015+)中,迭代器和生成器已经成为 JavaScript 的一部分,并得到广泛支持。但在一些旧版本的环境中可能不支持这些特性,所以在使用时需根据目标环境进行兼容性考虑。

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

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

相关文章

Java面试Day12

1.意向锁是什么&#xff1f;有什么作用&#xff1f;它是表级锁还是行级锁&#xff1f; 意向锁是什么 在使用 InnoDB 引擎的表里时对某些记录加上「共享锁」之前&#xff0c;需要先在表级别加上一个「意向共享锁」 在使用 InnoDB 引擎的表里时对某些记录加上「独占锁」之前&…

RK3568 NPU YOLOV5S 目标检测DEMO

视频流解析 硬件环境 开发板&#xff1a;RK356X 系统&#xff1a;Debian11 获取源码 程序源码内置SDK目录 $ ls external/rknpu2/examples/rknn_yolov5_video_demo/build build-android_RK356X.sh build-android_RK3588.sh build-linux_RK356X.sh build-linux_RK3588…

《计算机系统与网络安全》第五章 消息认证与数字签名

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

4.28 周期信号的傅里叶变换

非周期信号的谱之所以是连续的&#xff0c;是因为非周期信号相当于信号是无穷大的&#xff0c;那w -> 0&#xff0c;因此就演变成了连续谱了 原来的Fn变成了高度为无穷小&#xff0c;w谱线之间拼起来的连续谱了&#xff0c;由于无穷小的量我们看不到它&#xff0c;那怎么办呢…

77、基于STM32单片机学生信息管理系统指纹密码控制设计(程序+原理图+参考论文+相关资料+开题报告+任务书+元器件清单等)

单片机主芯片选择方案 方案一&#xff1a;AT89C51是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元&a…

【TCP/IP】利用I/O复用技术实现并发服务器 - epoll

目录 select的缺陷 epoll函数 epoll_create epoll_ctl epoll_wait 基于epoll的回声服务器实现 select的缺陷 在之前&#xff0c;我们使用了select函数完成了对回声服务器端I/O的复用&#xff0c;但是从代码上依然存有缺陷&#xff0c;主要集中在&#xff1a; 每次调用se…

ModaHub魔搭社区:向量数据库Milvus性能优化问题(三)

目录 Milvus 的导入性能如何&#xff1f; 边插入边搜索会影响搜索速度吗&#xff1f; 批量搜索时&#xff0c;用多线程的收益大吗&#xff1f; 为什么同样的数据量&#xff0c;用 GPU 查询比 CPU 查询慢&#xff1f; Milvus 的导入性能如何&#xff1f; 客户端和服务端在同…

__attribute__机制

__attribute__((constructor))和 __attribute__((destructor)) __attribute__((constructor))&#xff1a;放在main函数之前执行的函数的前面。 __attribute__((destructor))&#xff1a;放在main函数之后执行的函数的前面。 测试代码 #include <stdio.h> #include &l…

RocketMQ 详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;RocketMQ 详解 ✅创作者&#xff1a;林在闪闪发光 ⏰预计时间&#xff1a;30分钟 &#x1f389;个人主页&#xff1a;林在闪闪发光的个人主页 &#x1f341;林在闪闪发光的个人社区&#xff0c;欢迎你的加入: 林在闪闪发光…

【Shell】复制用户传参的文件夹

授权 cd /Users/lion/Downloads/shell-test-demos chmod ux *.sh#!/bin/bashprintHelp() {echo "-p pic (required) path for pic"exit 1 }while getopts p:h OPT; docase $OPT inp) path"$OPTARG" ;;esac done# check api_key exists if [ -z "$pat…

IDEA字体配置

IDEA默认字体&#xff1a;JetBrains Mono 1、下载Monaco字体&#xff08;windows版&#xff09;&#xff1a;下载地址&#x1f448; 2、双击安装 3、在IDEA中切换Monaco字体

帆软Json数据集插件,数据查询及参数控件传参

先看Demo 文本查询&#xff0c;下拉复选框查询&#xff0c;无参数时查全部 有参数传参时 1.定义数据连接 测试地址&#xff1a; http://fine-doc.oss-cn-shanghai.aliyuncs.com/book.json 2.新建json数据集&#xff0c;查询全表 2.1.查询全表 2.2.查询单个字段 3. 上述是简单…

CLion开发STM32

CLion开发STM32 opencd https://gnutoolchains.com/arm-eabi/openocd/ gcc-arm-none-eabi https://launchpad.net/gcc-arm-embedded/download arm-none-eabi-gcc -v“gcc-arm-none-eabi是GNU项目下的软件,是一个面向裸机arm的编译器。 mingw 需要把opencd和的工具链添加…

移远通信全新3GPP NTN R17模组正式上线,助力实现空天地海网络全覆盖

6月29日&#xff0c;在2023上海世界移动通信大会期间&#xff0c;物联网整体解决方案供应商移远通信正式宣布&#xff0c;推出符合3GPP NTN R17标准的全新5G卫星通信模组——CC950U-LS。该产品面向国内物联网市场&#xff0c;将为蜂窝网络无法覆盖的森林、海洋、沙漠等偏远地区…

抖音SEO矩阵源码开发(一)

前言&#xff1a; 1.抖音SEO矩阵系统源码开发 是一项技术密集型工作&#xff0c;需要对大数据处理、人工智能等领域有深入了解。该系统开发过程中需要用到多种编程语言在服务器上安装LNMP环境&#xff0c;包括Linux操作系统、Nginx、MySQL、PHP等&#xff0c;如Java、Python等…

CTF安全竞赛介绍

目录 一、赛事简介 二、CTF方向简介 1.Web&#xff08;Web安全&#xff09; &#xff08;1&#xff09;简介 &#xff08;2&#xff09;涉及主要知识 2.MISC&#xff08;安全杂项&#xff09; &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;涉及主要知识 3…

Vue3 刨析响应式原理

ref 目标 了解 Vue &#xff0c;手写一个方法&#xff0c;实现响应式&#xff0c;并读懂响应式 源码 class MyRef {constructor(value) {this._value value}// 访问器get value() {console.log(触发 getter 函数 访问);return this._value}// 读取器set value(newVal) {cons…

基于Android新生预报到系统APP的设计与实现

1.引言 随着国家的教育方针政策的不断改变&#xff0c;自20世纪初以来&#xff0c;政府开始实施扩招计划&#xff0c;截至2020年我国大学生总规模己经攀升至近5000万&#xff0c;大学教育的普及化正在逐渐实现。随着大学新生数量的不断增多&#xff0c;到了每年的9月份&#x…

实现Linux(Ubuntu22.04)与Windows文件互通共享(双方永久往来~)

Samba服务器了解&#xff08;防守&#xff09; Samba是一个开源软件套件&#xff0c;它允许在不同操作系统之间共享文件、打印机和其他资源。它是基于SMB/CIFS协议&#xff0c;这是一种用于在Windows系统中共享文件和打印机的网络协议。Samba服务器可以在Linux、Unix、macOS和…

玩转C++调试之Python的GDB库增强

玩转C调试之Python的GDB库增强 0.导语 调试是软件开发过程中不可或缺的一环&#xff0c;而GDB&#xff08;GNU调试器&#xff09;作为一款功能强大的调试工具&#xff0c;在开发者中得到广泛应用。除了传统的命令行调试功能外&#xff0c;GDB还提供了Python的GDB库&#xff0c;…