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

在这里插入图片描述

文章目录

  • 💙迭代器(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 的一部分,并得到广泛支持。但在一些旧版本的环境中可能不支持这些特性,所以在使用时需根据目标环境进行兼容性考虑。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在WSL2中安装IntelliJ IDEA开发工具

一、wsl支持图形 windows安装xming https://sourceforge.net/projects/xming/ 添加白名单 查看服务器ip ifconfig 编辑配置文件(结合自己的安装目录) ‪D:\ProgramFiles\Xming\X0.hosts 启动Xlaunh wsl 配置并验证 #b编辑配置文件 vi ~/.bashrc #末尾增加配置 export DI…

二、1什么是面向对象编程?

你好&#xff0c;我是程序员雪球&#xff0c;接下来与你一起学习什么是面向对象编程。 面向对象编程是一种编程风格。它以类或对象作为组织代码的基本单元&#xff0c;并将封装&#xff0c;抽象&#xff0c;继承&#xff0c;多态四个特性&#xff0c;作为代码设计的实现基石。 …

你如何理解 JS 的继承?

在JavaScript中&#xff0c;继承是一种机制&#xff0c;允许一个对象&#xff08;子类&#xff09;从另一个对象&#xff08;父类&#xff09;继承属性和方法。这使得子类可以共享父类的功能&#xff0c;并有能∧自身定义新的功能。 JavaScript中的继承通过原型链实现。 具体来…

RabbitMQ管理界面介绍

1.管理界面概览 connections&#xff1a; 无论生产者还是消费者&#xff0c;都需要与RabbitMQ建立连接后才可以完成消息的生产和消费&#xff0c;在这里可以查看连接情况 channels&#xff1a; 通道&#xff0c;建立连接后&#xff0c;会形成通道&#xff0c;消息的投递获取依…

ChatGPT中 top_p 和 temperature 的作用机制

1. temperature 的作用机制 GPT 中的 temperature 参数调整模型输出的随机性。随机性大可以理解为多次询问的回答多样性、回答更有创意、回答更有可能没有事实依据。随机性小可以理解为多次询问更有可能遇到重复的回答、回答更接近事实&#xff08;更接近训练数据&#xff09;…

自动化测试框架[Cypress概述]

目录 前言&#xff1a; Cypress简介 Cypress原理 Cypress架构图 Cypress特性 各类自动化测试框架介绍 Selenium/WebDriver Karma Karma的工作流程 Nightwatch Protractor TestCafe Puppeteer 前言&#xff1a; Cypress是一个基于JavaScript的端到端自动化测试框架…

【SpringMVC 学习笔记】

SpringMVC 笔记记录 1. SpringMVC 简介2. 入门案例3. 基本配置3.1 xml形式配置3.2 注解形式配置 4. 请求4.1 请求参数4.1.1 普通类型传参4.1.2 实体类类型传参4.1.3 数组和集合类型传参 4.2 类型转换器4.3 请求映射 5. 响应 1. SpringMVC 简介 三层架构 2. 入门案例 3. 基本…

基于matlab使用深度学习估计身体姿势(附源码)

一、前言 此示例演示如何使用 OpenPose 算法和预训练网络估计一个或多个人的身体姿势。 身体姿势估计的目标是识别图像中人的位置及其身体部位的方向。当场景中存在多个人时&#xff0c;由于遮挡、身体接触和相似身体部位的接近&#xff0c;姿势估计可能会更加困难。 有两种…

Spring概念:容器、Ioc、DI

目录 什么是容器&#xff1f; 什么是 IoC&#xff1f; 传统程序的开发 理解 Spring IoC DI 总结 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&#xff0c;有着活跃⽽庞⼤的社区&#xff0c;这就是它…

Swin Transformer训练报错问题

1. 训练遇到报错问题 &#xff08;1&#xff09;mportError: cannot import name _pil_interp from timm.data.transforms 原因&#xff1a; timm.data.transforms里面没有_pil_interp&#xff0c;只有str_to_pil_interp、_str_to_pil_interpolation、_pil_interpolation_to_s…

【Docker】docker安装配置Jenkins

docker 安装 Jenkins #拉镜像 docker pull jenkins/jenkins#创建卷(volume) docker volume create jenkins_home#制作容器并启动 docker run -d \ -p 8080:8080 \ -p 50000:50000 \ -v jenkins_home:/var/jenkins_home \ -v /usr/lib/jvm/java-8-openjdk-amd64:/usr/local/java…

如何将window文件夹挂载到VMware系统mnt目录

背景&#xff1a;项目开发过程中&#xff0c;通常是在Windows上编码&#xff0c;有些框架和软件只能够在Linux上面执行&#xff0c;如果在 VMware中的Linux上面开发不太方便&#xff0c;因此需要在Windows上面开发好再同步到Linux上面运行。 软件&#xff1a; Samba客户端 V…

配置Jenkins的slave agent并使用它完成构建任务

上一章&#xff0c;使用单机配置并运行了一个简单的maven项目&#xff0c;并发布到了一个服务器上启动。这一章将要配置一个slave agent&#xff0c;并将上一章的job放到agent上执行。我们agent使用的是ssh的方式 前置步骤 准备两台虚拟机&#xff1a; 192.168.233.32&#…

svn commit 用法

转载   原文&#xff1a;https://blog.csdn.net/qq_39790633/article/details/103700391 使用svn进行代码的提交有两种方法&#xff1a;一种是通过TortoiseSVN客户端界面进行提交&#xff0c;另一种是通过svn commit指令提交。 方法一&#xff1a;通过TortoiseSVN客户端界面提…

STM32速成笔记—IWDG

文章目录 一、IWDG简介二、STM32的IWDG2.1 STM32的IWDG简介2.2 喂狗2.3 IWDG框图 三、IWDG配置步骤四、IWDG配置程序4.1 IWDG初始化程序4.2 喂狗 五、应用实例 一、IWDG简介 独立看门狗&#xff08;Independent Watchdog, IWDG&#xff09;&#xff0c;什么是看门狗&#xff1…

NVIDIA-Linux-x86_64-535.54.03.run cuda_12.2.0_535.54.03_linux.run下载地址

Official Drivers | NVIDIA Linux x64 (AMD64/EM64T) Display Driver | 535.54.03 | Linux 64-bit | NVIDIA 下载连接 Download NVIDIA, GeForce, Quadro, and Tesla DriversDownload drivers for NVIDIA graphics cards, video cards, GPU accelerators, and for other GeFor…

魔兽世界私人服务器怎么开

开设魔兽世界的私人服务器涉及到一系列复杂的步骤和技术要求。下面是一个大致的指南&#xff0c;以供参考&#xff1a; 1. 硬件需求&#xff1a;首先&#xff0c;你需要一台强大的服务器来承载游戏服务器。服务器的规模和配置将取决于你计划同时容纳多少玩家以及服务器的性能要…

.vm文件发邮件时js未生效,无法控制显示隐藏

需求起因 最近在做一个发邮件的功能&#xff0c;是后端发邮件&#xff0c;不过邮件内容是由前端来写。 邮件内容包括姓名、手机号、邮箱&#xff0c;这三个参数都是不一定有的&#xff0c;如果没有某个参数时&#xff0c;那一行内容就不显示。 写法没错&#xff0c;但就是js…

Java——抽象类和接口

抽象类 抽象类 使用abstract关键字定义的类称为抽象类 public abstract class Employee {private String name;private int number; }在 Java中抽象类不可以实例化为对象。例如&#xff1a; 抽象方法 使用abstract关键字定义的方法称为抽象方法。抽象方法没有方法体 抽象…

使用影刀RPA拆分excel数据

首先&#xff0c;要使程序有一定的兼容性&#xff0c;即增加互动性&#xff0c;认为选择要拆分的文件和拆分的依据列&#xff0c;可以利用影刀中的‘打开选择对话框’和‘打开输入对话框’来实现&#xff0c;这样一来便不用考虑待拆分excel的路径问题获取1中选择的依据拆分列&a…