ES2015 Iterable(可迭代的)接口

2023-11-11

一、为什么ES2015提供Iterable(可迭代的)接口

ES中能够表示有结构的数据类型越来越多,以前有数组、对象等等,ES2015中新增了Map和Set对象…

为了给各种各样的数据结构提供统一遍历方式,ES2015提供了Iterable(可迭代的)接口

接口的概念:可以理解为一种规格标准

例如在ES中,任意一种数据类型都有toString()方法,这是因为他们都实现了统一的规格标准,即他们都实现了统一的接口

实现Iterable接口就是for…of的前提

二、了解for…of 的内部原理

在控制台打印数组、Set、Map这三个可以直接用for…in 遍历的对象

可以发现他们的原型对象当中都有一个以Symbol开头的属性,叫做iterator:
在这里插入图片描述

通过观察我们大概可以猜到

Iterable接口约定的就是对象当中必须要去挂载一个叫做iterator的方法

iterator方法是干什么的呢?

我们定义一个数组arr,手动调用一下它的iterator方法

它返回的是数组的迭代器对象,展开发现,对象里面有一个next方法
在这里插入图片描述

我们先定义一个变量来接收返回的迭代器对象,然后手动调用一下它的next方法
在这里插入图片描述

从上可以发现,在这个迭代器当中,内部维护了一个数据指针,每调用一次next(),这个指针都会往后移一位。done属性的作用是标识里面的数据是否被遍历完了。

为什么for … of 能作为遍历所有数据结构的统一方式?

因为它内部就是去调用被遍历对象的iterable方法得到一个迭代器,从而去遍历内部所有的数据。

只要对象也实现了iterable 接口,那我们就可以实现使用for…of 遍历对象

三、实现可迭代接口 Iterable

在ECMAScript中实现可迭代接口:在对象中挂一个iterator方法,在这个方法中返回一个迭代器对象

// 实现可迭代接口 Iterable
const obj = {
  [Symbol.iterator]:function(){
    return {
      next(){
        return{
          value:'zce',
          done:true
        }
      }
    }
  }
}

这时候我们再使用for of 去遍历 obj ,它就不会再报错了。

我们可以发现,它一共有3层对象,我们先梳理一下他们之间的关系

3.1、最外层自定义的对象:

{
[Symbol.iterator]:function(){
    return {
      next(){
        return{
          value:'zce',
          done:true
        }
      }
    }
  }
}

它实现了可迭代接口(英文名称为Iterable)

这个接口约定:内部必须要有一个用于返回迭代器的iterator方法

3.2、其次是,iterator方法返回的这个对象:


{
  next(){
    return{
      value:'zce',
      done:true
    }
  }
}

它实现了迭代器接口(英文为Iterator)
这个接口约定:内部必须要有一个用于迭代的next方法

3.3、最后就是在next方法中返回的对象:

{
  value:'zce',
  done:true
}

这个对象实现的叫做迭代结果接口(英文为iterationResult)

这个接口约定:内部必须要有一个value属性,用来表示当前被迭代
到的数据,还必须有个done属性,布尔值,用来表示迭代是否结束

四、测试可迭代接口


const obj = {
	store: ['foo', 'bar', 'baz'],
	[Symbol.iterator]: function () {
		let index = 0;
		const _this = this;
		return {
			next() {
				const result = {
					value: _this.store[index],
					done: index >= _this.store.length
				};
				index++;
				return result;
			}
		};
	}
};

for (const item of obj) {
	console.log(item);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES2015 Iterable(可迭代的)接口 的相关文章

  • darknet优化经验-AlexeyAB大神经验

    目录 darknet优化经验 1 AlexeyAB改进项 2 Linux下编译选项 3 训练经验 4 提升检测效果 5 总结 6 AlexeyAB大神改进 darknet优化经验 主要来自于 AlexeyAB 版本darknet 1 Ale
  • QT的使用(学习笔记3)

    Containers Group Box 用于分组 Scroll Area 滚动部件 Tool Box 列表窗口 改名 在属性栏下方 找currentItemText 每个窗口可放不同部件 Tab Widget 标签窗口 同Tool Box
  • Java集合面试题(总结最全面的面试题)

    小伙伴们有兴趣想了解更多相关学习资料请点赞收藏 评论转发 关注我之后私信我 注意回复 000 即可获取更多免费资料 集合容器概述 什么是集合 集合就是一个放数据的容器 准确的说是放数据对象引用的容器 集合类存放的都是对象的引用 而不是对象的
  • [USACO06FEB]Steady Cow Assignment G【二分+最大流】

    题目链接 P2857 USACO06FEB Steady Cow Assignment G 有N头牛 B个牛棚 告诉你每头牛心里牛棚的座次 即哪个牛棚他最喜欢 哪个第2喜欢 哪个第3喜欢 等等 但牛棚容量一定 所以每头牛分配到的牛棚在该牛心
  • 11 款超赞的 MySQL 图形化工具,好用!

    因公众号更改推送规则 请点 在看 并加 星标 第一时间获取精彩技术分享 点击关注 互联网架构师公众号 领取架构师全套资料 都在这里 0 2T架构师学习资料干货分 上一篇 2022年度最佳开源软件榜单出炉 大家好 我是互联网架构师 MySQL
  • r语言adf检验详细步骤_R语言关联分析操作步骤

    关联规则在打包购物 信息推荐等方面具有很高的利用价值 这里举一个简单的例子来说明R语言是怎么实现关联分析的 1 安装分别用于做关联分析和关联规则可视化的软件包 arules软件包 arulesViz软件包 install packages
  • JDBC数据操作模板

    在没有使用框架之前 对数据的操作是比较繁琐的 为此可以对JDBC数据的操作进行封装 以简化代码 以下是模板 author WDreamIn public class JDBCTemplate
  • FreeRTOS学习笔记-2-FreeRTOSConfig.h

    http www freertos org a00110 html 边看边试着翻译了下 发现看懂是一回事 写成文字表达出来又是另一个层次了 何况还有很多看不懂的 以后有机会 一点一点的补上去吧 lt gt gt gt FreeRTOS 的配
  • MAC配置python环境和一些库的心得,过程简略,只写大概步骤

    当初入手MAC之后首先第一件事就是安装python Django mysql环境 最郁闷的莫过于百度里面的各种抄 看了几页搜索结果基本一个样 你们不觉得这是缺德吗 下面是自己亲测的安装过程 细节没写 但是标注了一些其中遇到的错误 至于细节
  • python2.7配置tensorflow1.5.0和keras2.1.6

    说明 由于ROS使用的是python2 而之前网络模型训练的是python3 7 所以直接迁移会报错 需要重新配置python2 7的环境 1 tensorflow的版本 如果安装的tensorflow版本不对 那么在python2 7下
  • 在termux下安装pip

    termux的包安装命令是pkg或者apt 在termux下安装python包 一般直接pip 本笔记适合初初接触termux或者太久没碰termux而遗忘的 coder 翻阅 学习的细节是欢悦的历程 Python 官网 https www
  • 视频编辑软件Premiere Pro 2023 mac(pr2023)中文

    Premiere Pro mac是一款视频编辑软件 应用于电影制作 电视剧制作 广告制作等领域 它提供了丰富的视频编辑功能 让用户能够剪辑 修剪 调整视频素材 添加特效 过渡效果 以及调整音频等 Premiere Pro 2023 mac软
  • IP数据包详解

    引言 IP提供不可靠 无连接的数据报传送服务 不可靠 意思它不保证IP数据包能成功地到达目的地 IP仅提供尽力而为的传输服务 任何要求的可靠性必须有上层来提供 无连接 意思是IP并不维护任何关于后续数据报的状态信息 每个数据报的处理都是独立
  • fatfs/tiny文件系统的移植

    这个文件系统运行的时候需要的资源少 我的芯片只有2k RAM用这个文件系统刚好 fatfs tiny 么有格式化磁盘的功能 用到这5个文件 配置按照tff h中的说明来就可以了 只需要把我们自己的 读写函数应用到 diskio c中就可以了
  • 华为OD机试真题-内存资源分配-2023年OD统一考试(B卷)

    华为OD机试2023年最新题库 JAVA Python C 题目描述 有一个简易内存池 内存按照大小粒度分类 每个粒度有若干个可用内存资源 用户会进行一系列内存申请 需要按需分配内存池中的资源 返回申请结果成功失败列表 分配规则如下 1 分

随机推荐

  • Android控件-TabLayout使用介绍

    TabLayout 简述 简单示例 TabLayout属性介绍 tabIndicatorFullWidth tabRippleColor tabTextAppearance tabMode tabIndicatorColor tabIndi
  • vue自定义指令:只输入零和正整数

  • 用python怎么赚钱?Python躺赚大法!月入1W外快不在话下!!

    前言 领取python相关资料可以进q裙777899409免费领取 每晚还有大厂老师直播教学 学习路线 电子书籍 python学习相关资料领取 Python作为一门编程语言 一门技术 就一定能够为我们所用 至少赚个外快是绝对没有问题的 渠道
  • 一些看起来不错的Unity资源包

    把两个合并了 Unity assetstore一些好的插件资源
  • c语言--输出斐波那契数列的前10个数

    输出斐波那契数列的前10个数 include
  • 遥感+python 1.2 辐射定标

    遥感 python 1 2 辐射定标 目录 遥感 python 1 2 辐射定标 一 辐射定标概念 绝对定标 相对定标 二 辐射定标原理 三 代码实现 1 数据准备 2 参数获取 3 空值判断 4 辐射定标 5 源码下载 本章节 笔者主要讲
  • 线性代数(python)

    线性代数模块 概念 线性代数是数学运算中的一个重要工具 它在图形信号处理 音频信号处理中起非常重要的作用 numpy linalg模块中有一组标准的矩阵分解运算以及诸如逆和行列式之类的东西 例如 矩阵相乘 如果我们通过 对两个数组相乘的话
  • vue-admin-template中左上角logo让其显示、修改为自定义图片

    目录 显示logo 修改logo 显示logo 1 找到settings js文件 找到sidebarLogo 侧边栏logo 2 修改sidebarLogo的值为true 修改logo 1 找到src layout components
  • WEB前端网页设计-Bootstrap5 弹出框 & JavaScript 函数

    目录 Bootstrap5 弹出框 如何创建弹出框 指定弹出框的位置 关闭弹出框 JavaScript 函数 JavaScript 函数语法 调用带参数的函数 带有返回值的函数 语法 局部 JavaScript 变量 全局 JavaScri
  • TensorBoard 启动protobuf报错

    libprotobuf ERROR external protobuf archive src google protobuf descriptor database cc 334 Invalid file descriptor data
  • c语言成绩管理系统

    关注微信公众号每日新觉 私聊作者获取提取密码点击下面链接 私聊作者获取提取密码 https mp weixin qq com s QgRQ3YB2JqCvNOGQHQ57rA 作者每日新觉 是一名热爱技术和编程的年轻程序员 他在计算机科学和
  • js中,清空对象(删除对象的属性)

    在项目中 有些对象用完后需要重置 下面简单介绍下JS中清除对象的方法 方法如下 方法一 字面量定义对象 第一步 定义一个空对象并打印出来 代码和效果 代码 const student console log student 打印结果 第二步
  • 二进制ASCII转换(KeilC+Proteus) 跟书学程序系列

    给定的一个字节二进制数 转换成ASCII码 将累加器A中的值拆为两个ASCII码 并存入从RWESULT开始的两个单元中 示例程序给A赋值 1AH 代码如下 RESULT EQU 30H ORG 00HSTART MOV A 1AH CAL
  • Linux安装失败Grub-install问题超详细解决,傻瓜教学!!

    先说一下我安装Linux的过程 这里只是我无力地吐槽不想看直接往后跳 一年前接触Linux 软件安装GJ公众号上看到的 然后在虚拟机上跑 最近认识了一个大佬 双 爽 系统Ubuntu18 04 win10 突发奇想我也来装个双系统 双系统就
  • 常用端口对照表

    TCP 端口 静态端口 端口类型 端口号 注释 TCP 0 Reserved TCP 1 TCP Port Service Multiplexer TCP 2 Death TCP 5 Remote Job Entry yoyo TCP 7
  • Windows环境下利用Wget批量下载Earthdata数据

    使用wget下载Earthdata数据 首先是下载wget exe 然后保存在自己预设的目录中 同时将Earthdata上获取的download txt也放在该目录中 想要批量下载的数据的路径就保存在该txt文件中 接着win R打开cmd
  • js如何将选中图片文件转换成Base64字符串?

    如何将input type file 选中的文件转换成Base64的字符串呢 1 首先了解一下为什么要把图片文件转换成Base64的字符串 在常规的web开发过程中 大部分上传文件都是在web页面端通过表单直接提交 再由服务器端捕获请求来进
  • HBuilderX连接MuMu模拟器

    1 打开MuMu多开器 启动MuMu模拟器 然后点击ADB查看模拟器的端口号 2 在HBuilderX中配置模拟器端口号和adb路径 以自己的实际路径为准 3 配置环境变量 因为需要运行adb命令 所以需要配置环境变量 在MuMu的安装路径
  • 关于Android Studio检测不到模拟器/真机

    问题表现 初始化ADB不成功 无法连接到ADB unable to establish a connection to adb 打开选择设备界面 检测不到任何模拟器or真机 或许还有其他问题 通常的解决方法 按照网上大部分流传的 查看是否是
  • ES2015 Iterable(可迭代的)接口

    一 为什么ES2015提供Iterable 可迭代的 接口 ES中能够表示有结构的数据类型越来越多 以前有数组 对象等等 ES2015中新增了Map和Set对象 为了给各种各样的数据结构提供统一遍历方式 ES2015提供了Iterable