ES6迭代器 Iterator 详细介绍

news2024/11/20 10:33:07

文章目录

    • 前言
    • 一、==Iterator==
    • 二、迭代过程
    • 三、可迭代的数据结构
      • 3.1 Array
      • 3.2 String
      • 3.3 Map
      • 3.4 Set
      • 3.5 arguments
    • 总结

前言

迭代器,是 ES6 引入的一种新的遍历机制,主要讲解的是 Iterator 、迭代过程、可迭代的数据结构。

一、Iterator

Iterator 是 ES6 引入的一种新的遍历机制,迭代器有两个核心概念:

迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为== Symbol.iterator ==的方法来实现;

迭代器是用于遍历数据结构元素的指针(如数据库中的游标)。

二、迭代过程

迭代的过程如下:

通过 Symbol.iterator 创建一个迭代器,指向当前数据结构的起始位置;

随后通过 next 方法进行向下迭代指向下一个位置,next 方法会返回当前位置的对象,对象包含了 value 和 done 两个属性,value 是当前属性的值,done 用于判断是否遍历结束;

当 done 为 true 时则遍历结束。

实例代码:

const items = ["zero", "one", "two"];
const it = items[Symbol.iterator]();

it.next();
//{value: "zero", done: false}
it.next();
//{value: "one", done: false}
it.next();
//{value: "two", done: false}
it.next();
//{value: undefined, done: true}

在终端使用 node 命令运行:
在这里插入图片描述

上面的例子,首先创建一个数组,然后通过== Symbol.iterator ==方法创建一个迭代器,之后不断地调用 next 方法对数组内部项进行访问,当属性 done 为 true 时访问结束。

迭代器是协议(使用它们的规则)的一部分,用于迭代。该协议的一个关键特性就是它是顺序的:迭代器一次返回一个值。这意味着如果可迭代数据结构是非线性的(例如树),迭代将会使其线性化。

三、可迭代的数据结构

String,Array,Map,Set,Dom 元素是所有内置的可迭代对象,他们的原型对象都有一个 ==[Symbol.iterator] ==方法。

我们将使用 for…of 循环(参见下文的 for…of 循环)对数据结构进行迭代。

3.1 Array

数组(Array)和类型数组(TypedArray)他们是可迭代的。

for (let item of ["zero", "one", "two"]) {
  console.log(item);
}

// zero
// one
// two

新建 index.js 文件进行学习,示例代码:

for (let item of ["zero", "one", "two"]) {
  console.log(item);
}

在终端使用 node 命令运行,效果如下:
在这里插入图片描述

3.2 String

下面是两种方法迭代 String 对象的示例,分别新建两个名为 index1、index2 的 JS 文件。

// 方法一
// index1.js

// for ... of
const str = "xiaoniuma";
for (const char of str) {
  console.log(char);
}

在终端使用 node 命令运行,效果如下:
在这里插入图片描述

// 方法二
// index2.js
// iterator
const str = "xiaoniuma";
const iterator = str[Symbol.iterator](); // 返回一个{next:方法}对象
let obj = null;
do {
  obj = iterator.next(); // 返回的是对象,{value:任意对象,done:布尔型}
  console.log(obj);
} while (!obj.done);

在这里插入图片描述

3.3 Map

Map 主要是迭代它们的 entries,每个 entry 都会被编码为 [key, value]·的项, entries 是以确定的形势进行迭代,其顺序是与添加的顺序相同。

新建 index3.js 文件,示例代码

const map = new Map();
map.set(0, "zero");
map.set(1, "one");

for (let entry of map) {
    console.log(entry);
}

// [0, "zero"]
// [1, "one"]

在终端使用 node 命令运行,效果如下:
在这里插入图片描述

  • 注意: WeakMaps 不可迭代

3.4 Set

Set 是对其元素进行迭代,迭代的顺序与其添加的顺序相同

新建 index4.js 文件,示例代码:

const set = new Set();
set.add("red");
set.add("green");
set.add("blue");

for (let item of set) {
    console.log(item);
}

// red
// green
// blue

在终端使用 node 命令运行,效果如下:

在这里插入图片描述

3.5 arguments

arguments 目前在 ES6 中使用越来越少,但也是可遍历的

新建 index5.js 文件进行学习,示例代码:

function args() {
    for (let item of arguments) {
        console.log(item);
    }
}
args("red", "green", "blue");

// red
// green
// blue

在终端使用 node 命令运行,效果同六。

总结

通过本文的学习,我们学会了迭代,迭代虽然一般用的较少,但是了解其原理是非常有必要的,这样才可以实现定义自己的迭代器来遍历对象。

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

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

相关文章

MAC泛洪攻击-ARPDOS攻击-ARP Middleman攻击-IP地址欺骗-ICMP DOS 攻击

项目二 目录 文章目录一、搭建实验环境:1. 网络环境架构2. 实验环境与工具:3. 搭建两侧的局域网4. 搭建路由二、MAC泛洪攻击1. 实验环境2. 实验过程3. 实验分析:三、ARP DOS攻击1. 实验环境2. 实验过程3. 实验分析:四、ARP Middleman 攻击1. …

《SQL基础》08. 多表查询

SQL - 多表查询多表查询多表关系一对多多对多一对一多表查询概述分类内连接外连接自连接联合查询子查询分类标量子查询列子查询行子查询表子查询案例多表查询 多表关系 项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系&#…

使用MySQL数据库,实现你的第一个JDBC程序

熟悉了JDBC的编程步骤后,接下来通过一个案例并依照上一小节所讲解的步骤来演示JDBC的使用。此案例会从tb_user表中读取数据,并将结果打印在控制台。需要说明的是,Java中的JDBC是用来连接数据库从而执行相关数据相关操作的,因此在使…

双面电子会议桌牌

产品特征: 超低功耗,3-5年电池寿命电子纸墨水屏幕,视角接近180多种电子桌牌显示颜色可选 3色(黑,白,红) 4色(黑,白,红,黄) 7色&…

营销大数据如何帮助企业深入了解客户—镭速

随着互联网的进一步发展,大门向您的企业敞开大门,让您在如何使用数据为客户提供他们所寻求的个性化,令人兴奋和引人入胜的体验方面更具创造性和创新性。大数据是了解客户究竟是谁以及如何与他们互动的关键部分。 行动中的见解 随着智能手机…

听劝,不要试图以编程为基础去学习网络安全

目录一、网络安全学习的误区1.不要试图以编程为基础去学习网络安全2.不要刚开始就深度学习网络安全3.收集适当的学习资料4.适当的报班学习二、学习网络安全的些许准备1.硬件选择2.软件选择3.外语能力三、网络安全学习路线第一阶段:基础操作入门第二阶段:…

什么是基站定位?

基站与信号塔首先,我们先介绍一下基站。基站包括移动、联通和电信基站,当手机开机、关机、切换基站时都会向最近最优基站赋权。其主要功能是负责用户手机端信号传出工作,包括语音通话、网络访问等各项业务。这里我们特别强调一个误区&#xf…

不离不弃生死相依

男孩儿:“对不起……” 女孩儿:“无所谓,你没什么对不起我的。” 键盘敲出最后这句话,女孩儿失声痛哭。 爱上他是女孩儿没有想到的事情,她以为自己不会爱上任何人。 可最后还是敌不过男孩儿的温柔,陷了进去…

OpenMMLab AI实战课笔记

1. 第一节课 1.1 计算机视觉任务 计算机视觉主要实现以下目标: 分类目标检测分割:语义分割、实例分割 (对像素进行精确分类, 像素粒度或细粒度)关键点检测 1.2 OpenMMLab框架 框架选择:PyTorchOpenMMLab是基于PyTorch开发的code base, …

linux_信号

文章目录1、信号的实现机制2、发送信号2.1、发送信号的原因2.2、发送信号的机制kill 函数3、接收信号3.1、处理信号signal 函数sigaction 函数3.2、信号阻塞 | 解除sigset_t 信号集合sigpending 函数sigprocmask 函数sigsuspend 函数4、定时器4.1、睡眠函数sleep 函数pause 函数…

STM32 学习笔记_1前言;软件安装

前言 学习自江科大自动协 b站课程。 呜呼!今朝有坑今朝开,管他明朝埋不埋!开新坑的过程是最爽的。 STM32 是 ST 公司基于 ARM CORE-M 芯片(类似 CPU)开发的32位的单片机,相比8位的51单片机性能更强。&am…

【数据结构】哈希表的原理及实现

1.什么是哈希表 哈希表又称为散列表,它是一种以键值对形式来存储数据的结构,只要输入待查找的key,就可以通过该key寻找到对应的值。对应函数:y f(key)通过把关键码映射到表中的对应位置来访问对应信息,来加快查找速度…

机械设备行业ERP在企业中如何发挥作用?

对机械设备制造企业而言,一方面,大部分销售额都集中在少数几个客户,很难实时了解市场和用户真实需求,订单修改、取消,销售、生产预测不准,原料积压、作废等是常有的事,日积月累给企业造成极大的…

【官方 | 计算机二级Python教程】第一章:程序设计基本方法

【官方 | 计算机二级Python教程】第一章:程序设计基本方法参考书目第一章:程序设计基本方法本章知识导图1.1 程序设计语言1.1.1 程序设计语言概述1.1.2 编译和解释1.2 Python语言概述1.2.1 Python语言的发展1.2.2 Python最小程序1.3 Python开发环境配置1…

iptables端口复用_远程操控

目录 方式一:利用 ICMP 做遥控开关 一、创建端口复用链 二、创建端口复用规则 三、设置开启开关 四、设置关闭开关 五、将发现的数据包转到HTTP_SSH_PORT链上进行处理 六、开启复用 七、关闭复用 方式二:利用tcp数据包中的关键字做遥控开关 一…

【Java】GET 和 POST 请求的区别

GET 和 POST 请求的区别 GET 和 POST请求是最常用的两种请求方法,写了几个Servlet项目,发现这两种请求用的实在是多,给我的感觉就是这两个请求仿佛只有一个名字不同而已。但是通过查询资料发现,里面大有文章。HTTP协议定义的方法…

从0开始学python -18

Python3 元组 Python 的元组与列表类似,不同之处在于元组的元素不能修改。 元组使用小括号 ( ),列表使用方括号 [ ]。 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。 实例(Python 3.0) >>> tup1 (Go…

研发能力加码!维视智造团队入选“科学家+工程师”队伍!

一、维视智造成功入选2023年度秦创原“科学家工程师”队伍近日,陕西省科学技术厅公布了2023年度秦创原“科学家工程师”队伍入选名单,维视智造旗下欣维视觉工程师团队联合西北工业大学马志强副教授团队,申报的“大口径光学元件形性误差检测方…

第9章 Idea集成gitee(码云)

第一节 码云简介 众所周知,GitHub服务器在国外,使用GitHub作为项目托管网站,如果网速不好的话,严重影响使用体验,甚至会出现登录不上的情况。针对这个情况,大家也可以使用国内的项目托管网站-码云。 码云…

golang 协程关闭——谁敢说没踩过坑

Go语言中,协程创建和启动非常简单,但是如何才能正确关闭协程呢,和开车一样,前进总是很容易,但是如何正确的把车停在指定的地方总是不容易的。生产实践中,go常常遇到未能正确关闭协程而影响程序运行的场景&a…