Iterator 和 for...of 循环

本系列属于阮一峰老师所著的ECMAScript 6 入门学习笔记


Iterator(遍历器)

JavaScript表示“集合”的数据结构,除了ArrayObject ,ES6又新增了MapSet

遍历器(Iterator)是一种统一的接口机制,用来处理所有不同的数据结构。

Iterator的作用有三个:一位各种数据结构提供一个统一的、简便的访问接口;二是使得数据结构的成员能够按照某种次序排列;三是ES6创造了一种新的命令for..of循环,Iterator接口主要供for...of消费

默认Iterator接口

ES6规定,默认的Iterator接口部署在数据结构的Symbol.iterator属性,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。

可遍历的数据结构具有Symbol.iterator属性。执行这个属性会返回一个遍历器对象。该对象的根本特征就是具有next方法,每次调用next方法都会返回一个代表当前队员的信息对象,具有valuedone两个属性。

原生具备Iterator接口的数据类型如下:

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函数的arguments对象
  • NodeList对象
// 原生部署Itertor接口的数据接口,不用自己写遍历器生成函数,可使用for...of
lelt arr = [1,2,3]
let iter = arr[Symbol.iterator]()
iter.next() // {value:1,done:false}
iter.next() // {value:2,done:false}
iter.next() // {value:3,done:false}
iter.next() // {value:undefined,done:false}// 类似对象不具备Itertor接口,需要自己部署Symbol.iterator属性
let obj = {data: ['hello','world'],[Symbol.iterator](){const self = thislet index = 0return {next(){if(index < self.data.length){return {value: self.data[index++],done: false}}else{return {value: undefined,done:true}}}}}
}// 类数组对象(存在数值键名和length属性),Symbol.iterator方法可直接引用数组的Iterator接口
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator]
遍历器对象的return(),throw()

遍历器对象除了具有next方法,还具有return方法和throw方法

return方法的使用场合是:如果for...of循环提前退出(通常是因为出错,或者有break语句或continue语句,就会调用return方法。如果一个对象在完成遍历前需要清理或释放资源,就可以部署return方法)

throw方法主要是配合Generator函数使用,一般遍历器对象用不到这个方法

for...of循环

ES6 借鉴 C++、Java、C# 和 Python 语言,引入了for...of循环,作为遍历所有数据结构的统一的方法。

JavaScript提供多种遍历语法,最原始的for循环,比较麻烦。

数组提供内置的forEach方法,但是无法中途跳出循环,不能使用breakreturn

for...in循环有几个缺点:

  • 数组的键名是数字,但是for...in循环是以字符串作为键名'0'、'2'、'3'等
  • for...in不仅遍历数字键名,还会遍历Iterator 和 for...of 循环手动添加的其他键,甚至包括原型链上的键
  • 某些情况下,for...in循环会以任意顺序遍历键名

与以上遍历相比,for...of有一些显著的优点

  • for...in一样简洁,但是没有那些缺点
  • 不同于forEach方法,可以和breakcontinuereturn配合使用
  • 提供了遍历所有数据结构统一的操作接口

转载于:https://www.cnblogs.com/pengzhixin/p/7693123.html

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

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

相关文章

JAVA常量

2019独角兽企业重金招聘Python工程师标准>>> 常量就是一个固定值。它们不需要计算&#xff0c;直接代表相应的值。 常量指不能改变的量。 在Java中用final标志&#xff0c;声明方式和变量类似&#xff1a; final double PI 3.1415927; 虽然常量名也可以用小写&…

基于Docker托管Azure DevOps代理

Azure DevOps非常好用&#xff0c;但是为代理准备单独的服务器经常会显得性价比不高&#xff1a;配置低了&#xff0c;前端构建时会教会你做人&#xff0c;配置太高又有点浪费资源&#xff0c;代理数量少了各团队构建要打架。对于既想享受DevOps的美妙之处但是资源捉襟见肘的小…

微软 word转换pdf_如何将行转换为Microsoft Word表中的列

微软 word转换pdfYou’ve created a table in Word and started to enter your data. Then, you realize that the table should be transposed, meaning the rows should be columns and vice versa. Rather than recreating the table and manually entering the data again,…

pycharm中如何正确配置pyqt5

网上看了几个文章&#xff0c;不成功。这样做才是正确姿势&#xff1a; /Users/mac/anaconda3/bin/Designer.app /Users/mac/anaconda3/bin$ProjectFileDir$ pyuic5 $FileName$ -o $FileNameWithoutExtension$.py $ProjectFileDir$ 其它细节懒得说。 转载于:https://www.cnblog…

JS常用的设计模式

持续更新JS常用的设计模式以及应用场景*以下内容为个人简单理解以及摘抄部分网上demo组成&#xff0c;有错误请在下方评论指出?*# 何谓设计模式没必要被高大上的名词所吓倒&#xff0c;日常coding中或许一个不了解各种设计模式的程序员可能自己其实已经用到了很多抛开官方的定…

如何在Photoshop中制作双曝光图像

Double exposure images are popular at the moment. Taylor Swift’s Style music video and the True Detective opening theme both used the effect. It’s a technique where two separate photos—typically a portrait and a landscape—are blended together into one …

记一次.NET 某安全生产系统 CPU爆高分析

一&#xff1a;背景 1.讲故事今天是&#x1f40f;的第四天&#xff0c;头终于不巨疼了&#xff0c;写文章已经没什么问题&#xff0c;赶紧爬起来写。这个月初有位朋友找到我&#xff0c;说他的程序出现了CPU爆高&#xff0c;让我帮忙看下怎么回事&#xff0c;简单分析了下有两点…

JDBC 学习笔记(一)—— JDBC 基础

1. 什么是 JDBC JDBC&#xff0c;Java Database Connectivity&#xff08;Java 数据库连接&#xff09;&#xff0c;是一组执行 SQL 语句的 Java API。 JDBC&#xff0c;是 Java SE&#xff08;Java Platform, Standard Edition&#xff09;标准的一部分。 Java 程序可以通过 J…

JavaScript享元模式

JavaScript享元模式 通过两个例子的对比来凸显享元模式的特点&#xff1a;享元模式是一个为了提高性能(空间复杂度)的设计模式&#xff0c;享元模式可以避免大量非常相似类的开销。 第一实例&#xff0c;没有使用享元模式&#xff0c;计算所花费的时间和空间使用程度。 要求为&…

mac屏幕截图_如何在Mac上拍摄屏幕截图

mac屏幕截图On a Mac, you can take screenshots with a few quick keyboard shortcuts. But Mac OS X also includes more powerful screenshot tools, too. Here are some of the many ways you can get a screenshot on OS X. 在Mac上&#xff0c;您可以使用一些快速的键盘快…

实现 .Net 7 下的数据库定时检查

在软件开发过程中&#xff0c;有时候我们需要定时地检查数据库中的数据&#xff0c;并在发现新增数据时触发一个动作。为了实现这个需求&#xff0c;我们在 .Net 7 下进行一次简单的演示。PeriodicTimer .Net 6 中新增了 PeriodicTimer 这个类&#xff0c;它可以用来创建一个定…

新手AS常见问题集锦

开发环境 以前开发android的时候可以使用eclipse&#xff0c;虽然现在也能使用eclipse&#xff0c;但是google已经不再支持使用eclipse开发android了。因为google有了自己的IDE---android studio&#xff0c;这个IDE我自己认为安装的时候比较方便&#xff0c;唯一的缺点就是在下…

js进阶 11-6 jquery如何获取和设置元素的宽高(jquery多方法)

js进阶 11-6 jquery如何获取和设置元素的宽高&#xff08;jquery多方法&#xff09; 一、总结 一句话总结&#xff1a;jquery里面多是方法啊&#xff0c;比如jquery对象的宽高。所以取值是方法&#xff0c;赋值就是方法里面带参数。 1、百度富文本编辑器ueditor如何设置宽高&a…

SparseArray代替HashMap

相信大家都明白&#xff0c;手机软件的开发不同于PC软件的开发&#xff0c;因为手机性能相对有限&#xff0c;内存也有限&#xff0c;所谓“寸土寸金”&#xff0c;可能稍有不慎&#xff0c;就会导致性能的明显降低。Android为了方便开发者&#xff0c;特意在android.util这个包…

也许你曾经读过他的书

我们愿用“能理能文、才华多元”来形容他。因为热爱编程和游戏&#xff0c;所以他将爱好变成了职业&#xff0c;并在这条路上持续奔跑&#xff1b;因为热爱分享&#xff0c;所以他坚持在博客上分享技术观点并出版了关于 Azure、微软游戏栈的书籍&#xff1b;因为热爱挑战&#…

python测试框架数据生成工具最全资源汇总

xUnit frameworks 单元测试框架frameworks 框架unittest - python自带的单元测试库&#xff0c;开箱即用unittest2 - 加强版的单元测试框架&#xff0c;适用于Python 2.7以及后续版本pytest - 成熟且功能强大的单元测试框架plugincompat - pytest的执行及兼容性插件nosetests -…

t30智能插座怎么设置_如何设置ConnectSense智能插座

t30智能插座怎么设置If you like the idea of smart outlets, but wish you had one with more than just one receptacle on it, the ConnectSense Smart Outlet is worth looking into. Here’s how to set it up and instantly get double the fun. 如果您喜欢智能插座的想法…

用链表和数组实现HASH表,几种碰撞冲突解决方法

Hash算法中要解决一个碰撞冲突的办法&#xff0c;后文中描述了几种解决方法。下面代码中用的是链式地址法&#xff0c;就是用链表和数组实现HASH表。 he/*hash table max size*/ #define HASH_TABLE_MAX_SIZE 40/*hash table大小*/ int hash_table_size0;/*.BH----------------…

安卓操作sqlite3,增删改查

创建 layout <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:orientation"vertical"android:layout_width"match_parent"android:layo…

基于.NetCore开发博客项目 StarBlog - (23) 文章列表接口分页、过滤、搜索、排序

1前言上一篇留的坑&#xff0c;火速补上。在之前的第6篇中&#xff0c;已经有初步介绍&#xff0c;本文做一些补充&#xff0c;已经搞定这部分的同学可以快速跳过&#xff0c;基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表对标准的WebApi来说&#xff0c;分…