es6数组初始化_ES6 迭代器(Iterator)和 for...of循环使用方法
一、什么是迭代器?
生成器 概念在Java,Python等语言中都是具备的,ES6也添加到了JavaScript中。Iterator可以使我们 不需要初始化集合,以及索引的变量 ,而是使用迭代器对象的 next 方法,返回集合的下一项的值, 偏向程序化 。
迭代器 是带有特殊接口的对象。含有一个next()方法,调用返回一个包含两个属性的对象,分别是value和done, value表示当前位置的值 , done表示是否迭代完 ,当为true的时候,调用next就无效了。
ES5中遍历集合通常都是 for循环 ,数组还有 forEach 方法,对象就是 for-in ,ES6 中又添加了 Map 和 Set ,而迭代器可以统一处理所有集合数据的方法。迭代器是一个接口,只要你这个数据结构暴露了一个iterator的接口,那就可以完成迭代。ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。
二、如何使用迭代器?
1、默认 Iterator 接口
数据结构只要部署了 Iterator 接口,我们就成这种数据结构为"可遍历"(Iterable)。ES6 规定,默认的 Iterator 接口部署在数据结构的 Symbol.iterator 属性,或者说,一个数据结构只要具有 Symbol.iterator 数据,就可以认为是"可遍历的"(iterable)。
可以供 for...of 消费的原生数据结构
- Array
- Map
- Set
- String
- TypedArray(一种通用的固定长度缓冲区类型,允许读取缓冲区中的二进制数据)
- 函数中的 arguments 对象
- NodeList 对象
可以看上面的原生数据结构中并没有对象(Object),为什么呢? 那是因为对象属性的遍历先后顺序是不确定的,需要开发者手动指定。 本质上,遍历器是一种线性处理,对于任何非线性的数据结构,部署遍历器接口就等于部署一种线性变换 。 做如下处理,可以使对象供 for...of 消费:
// code1 function Obj(value) { this.value = value; this.next = null; } Obj.prototype[Symbol.iterator] = function() { var iterator = { next: next }; var current = this; function next() { if (current) { var value = current.value; current = current.next; return { done: false, value: value }; } else { return { done: true }; } } return iterator; } var one = new Obj(1); var two = new Obj(2); var three = new Obj(3); one.next = two; two.next = three; for (var i of one) { console.log(i); } // 1 // 2 // 3
2、调用 Iterator 接口的场合
(1) 解构赋值
// code2 let set = new Set().add('a').add('b').add('c'); let [x,y] = set; // x='a'; y='b' let [first, ...rest] = set; // first='a'; rest=['b','c'];
(2) 扩展运算符
// code3 // 例一 var str = 'hello'; [...str] // ['h','e','l','l','o'] // 例二 let arr = ['b', 'c']; ['a', ...arr, 'd'] // ['a', 'b', 'c', 'd']
(3)Generator 函数中的 yield* 表达式(下一章介绍)
// code4 let generator = function* () { yield 1; yield* [2,3,4]; yield 5; }; var iterator = generator(); iterator.next() // { value: 1, done: false } iterator.next() // { value: 2, done: false } iterator.next() // { value: 3, done: false } iterator.next() // { value: 4, done: false } iterator.next() // { value: 5, done: false } iterator.next() // { value: undefined, done: true }
(4)其它场合
- for..of
- Array.from
- Map()、Set()、WeakMap()、WeakSet()
- Promise.all()
- Promise.race()
3、for...of 循环的优势
先看看,数组 forEach 方法的缺点:
// code5 myArray.forEach(function (value) { console.log(value); });
这个写法的问题在于, 无法中途跳出 forEach 循环,break 命令或 return 命令都不能生效 。
再看看,对象 for...in 的循环的缺点:
for (var index in myArray) { console.log(myArray[index]); };
- 数组的键名是数字,但是 for...in 循环是以字符串作为键名,"0"、"1"、"2"等。
- for...in 循环不仅可以遍历数字键名,还会遍历手动添加的期推荐,甚至包括原型链上的键。
- 某些情况下,for...in 循环会议任意顺序遍历键名
- for...in 遍历主要是为遍历对象而设计的,不适用于遍历数组
那么, for...of 有哪些显著的优点呢 ?
- 有着同 for...in 一样的简洁语法,但是没有 for...in 那些缺点
- 不同于 forEach 方法,它可以与 break、continue 和 return 配合使用
- 提供了遍历所有数据结构的统一操作接口
- for (var n of fibonacci) { if (n > 1000) { break; console.log(n); } }
4、各数据类型如何使用 for...of 循环?
(1)数组
- for...of 循环允许遍历数组获得键值
- var arr = ['a', 'b', 'c', 'd']; for (let a in arr) { console.log(a); // 0 1 2 3 } for (let a of arr) { console.log(a); // a b c d }
- for...of 循环调用遍历器接口,数组的遍历器接口只返回具有数字索引的值
- let arr = [3, 5, 7]; arr.foo = 'hello'; for (let i in arr) { console.log(i); // "0
es6数组初始化_ES6 迭代器(Iterator)和 for...of循环使用方法相关推荐
- ES6新特性_ES6迭代器应用-自定义遍历数据---JavaScript_ECMAScript_ES6-ES11新特性工作笔记019
然后我们用迭代器做一个自定义的遍历数据案例. 首先我们有个banji,这个对象,可以看到有name属性,有stus属性,stus是个数组 我们用for of遍历试试,不让遍历报错了对吧,说,他不是一个 ...
- ES6新特性_ES6迭代器技术---JavaScript_ECMAScript_ES6-ES11新特性工作笔记018
然后我们再来看迭代器 迭代器,就跟java中的iterator一样的. 首先先看看遍历数组我们可以用 for....of 或者for ...in 可以看到用of,获取的是值 用in获取的是key,下标 ...
- ES6中的迭代器(Iterator)和生成器(Generator)
用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作 ...
- 深入解析ES6中的迭代器(Iterator)和生成器(Generator)
用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作 ...
- c++迭代器iterator通用吗_「ES6基础」迭代器(iterator)
迭代器(iterator)是一个结构化的模式,用于从源以一次一个的方式提取数据.迭代器的使用可以极大地简化数据操作,于是ES6也向JS中添加了这个迭代器特性.新的数组方法和新的集合类型(如Set集合与 ...
- 浅析向量(Vector),迭代器(Iterator)和数组(Array)
目录 前言(Foreword): 向量(Vector): 1.何为向量? 2.如何初始化Vector向量? 3.向量的基本操作: 4.Range-based For Statement: 5.向量的插 ...
- php 数组是否属于迭代器,数组的迭代器属性Iterator介绍
[导读]数组默认有迭代器属性 数组默认有迭代器属性var arr = [111,222,333]; var aa = arr[Symbol.iterator](); aa.next(); // { v ...
- js数组初始化——ES6 Array.prototype.fill()实践记录
Array.prototype.fil()方法:用给定值填充数组 初始化: let array = new Array(5).fill(false); console.log(array); //显示 ...
- java for 迭代器_Java基础-迭代器Iterator与语法糖for-each
迭代器Iterator与语法糖for-each 一.为什么需要迭代器 设计模式迭代器 迭代器作用于集合,是用来遍历集合元素的对象.迭代器不是Java独有的,大部分高级语言都提供了迭代器来遍历集合.实际 ...
最新文章
- apache nginx禁止跨目录访问
- php实现微信企业向用户付款
- iOS点滴- ViewController详解
- 【Redis】16.Redis哨兵
- 2021 icme_2021第十届制造工程与工艺国际会议(ICMEP 2021)
- github(5):GitHub的注册与使用(详细图解)
- 【CodeForces - 1201C】Maximum Median(思维,水题)
- silverlight(一.安装和新建项目)
- linux系统中-E,-S,-c的区别和作用(怎么讲代码转化为机器识别的语言)
- sql主键可以有多个_干货 | 新手请速戳!30个精选SQL面试问题Qamp;A集锦
- mysql read uncomit_mysql配置文件,帮看看
- python和c++哪个好-C#、C++、Java、Python 选择哪个好?
- [循证理论与实践] meta分析系列之二: meta分析的软件
- 斯托克斯定理,de Rham上同调习题
- 腾讯「文涌 (Effidit)」2.0版发布,打造更懂写作的智能助手
- 爬了我的微信好友,原来他们是这样的...
- 渗透测试-业务逻辑与非常规漏洞原理与利用
- 计算机网络应用和ps的实训报告,ps实训报告心得体会.doc
- 我们应该如何优雅的处理 React 中受控与非受控
- 【SAS应用统计分析】方差分析
热门文章
- Android Java 8使用Lamda报错:Execution failed for task :app:transformJackWithJackForDebug - Android?...
- 使用Jest测试JavaScript (入门篇)
- Fragment专辑(一):Fragment简介
- Flask的闪现(message) 请求扩展 中间件 蓝图
- linux 小白启航之路-搭建linuxDHCP中继服务器
- CSS margin详解
- PHP获取当前域名$_SERVER['HTTP_HOST']和$_SERVER['SERVER_NAME']的区别
- idea控制台输出乱码
- Vim 基本配置和经常使用的命令
- Sql 查询当天、本周、本月记录