Iterator(es6)
1.任何数据结构只要部署了Iterator接口(本质是一个指针对象),也就是部署了Symbol.iterator属性,便可以完成遍历操作;数组原生就具备Iterator接口,就可以用for...of遍历。由于Iterator只是把接口规格加到数据结构之上,所以,遍历器与它所遍历的那个数据结构,实际上是分开的。
2.Iterator遍历过程:
- 创建一个指针对象,指向当前数据结构的起始位置;
- 调用next方法,可以将指针指向数据结构的第一个成员,返回一个包含value和done属性的对象;
- 继续调用next方法,......以此类推,直到指向结束位置。
//mock iterator
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{value: undefined, done: true};
}
};
} var arr = makeIterator([1, 2, 3]); arr.next(); //{value: 1, done: false}
arr.next(); //{value: 2, done: false}
arr.next(); //{value: 3, done: false}
arr.next(); //{value: undefined, done: true}
3.调用Iterator的场合(即会默认调用Symbol.iterator):
- 解构赋值
- 扩展运算符(...)
- yield*(后面跟一个可遍历的结构)
- 任何接收数组作为参数的场合(for...of等)
4.字符串也具有Iterator接口(typeof str[Symbol.iterator] === 'function')
5.Symbol.iterator可以用Generator函数实现,只要用yield命令给出每一步的返回值即可。
var obj = {};
obj[Symbol.iterator] = function* () {
yield 1;
yield 2;
} [...obj] // [1, 2]
6.for...of适用于数组、Set、Map、类数组对象(arguments、nodelist)、Generator、字符串。
7.for...in 和 for...of
- 前者只能获取对象的键名,后者可以得到键值;
- 对于数组,前者可以返回数组上的所有属性,后者只能返回具有数字索引的属性;
let arr = ['a', 'b', 'c'];
arr.d = 'hello'; for (let i in arr) {
console.log(i); // '0', '1', '2', 'd'
} for (let i of arr) {
console.log(i); // 'a, 'b', 'c'
}
- 前者主要为遍历对象而设计;不适用与遍历数组;
- 后者不同于foreach,可与break、continue、return配合使用;提供了遍历所有数据结构的统一接口。
8.iterator对象除了next方法,还有return、throw,而return必须返回一个对象。
9.fibonacci
var fib = {
[Symbol.iterator](){
let pre=0,cur=1;
return {
next(){
[pre, cur] = [cur, pre+cur];
return {done: false,value: cur};
}
}
}
}
for(var i of fib){
if(i>100)
break;
console.log(i)
}
Iterator(es6)的更多相关文章
- Java之集合初探(二)Iterator(迭代器),collections,打包/解包(装箱拆箱),泛型(Generic),comparable接口
Iterator(迭代器) 所有实现了Collection接口的容器都有一个iterator方法, 用来返回一个实现了Iterator接口的对象 Iterator对象称作迭代器, 用来方便的实现对容器 ...
- STL源码分析-iterator(迭代器)
1. GOF 迭代器设计模式 前面一篇文章有写到stl_list的实现,也实现了一下相应的iterator,但是后面觉得,实现具体容器之前有必要介绍一下iterator(迭代器) .那么迭代器是什么呢 ...
- Set,Multiset,Iterator(迭代器)详解
Set,Multiset,Iterator(迭代器) Iterator:迭代器 我们可以发现所谓一些数据结构比如说数组和链表,它们都有一些相似的性质.我们看下面两个例子: 数组:定义数组\(int~a ...
- JS - ECMAScript2015(ES6)新特性
友情提示:本文仅mark几个常用的新特性,详细请参见:ES6入门 - ryf: 碎片 var VS let VS const var:声明全局变量, let:声明块级变量,即局部变量 const:声明 ...
- JavaScript学习总结(七)——ECMAScript6(ES6)
一.ECMAScript概要 ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会,英文名称是European Computer Manufacturers Association)通 ...
- 设计模式之美:Iterator(迭代器)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Iterator 模式结构样式代码. 实现方式(二):实现 IEnumerable 中序遍历二叉树. 实现方式(三):实现 Bi ...
- ITERATOR(迭代器)设计模式
1 意图:提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 2 别名(Cursor) 3 动机:队列表的访问和遍历从列表对象中分离出来放入一个迭代器对象中. 多态迭代 ...
- STL之Iterator(迭代器)
概述 根据迭代器功能的不同,将迭代器分为以下几类: Iterator Category Ability Providers Input iterator Reads forward istream O ...
- 02函数-05-generator(ES6)
generator(生成器)是ES6标准引入的新的数据类型. generator看上去像一个函数,但可以返回多次,除了return语句,还可以用yield返回多次.定义方式如下: function* ...
随机推荐
- Java中log4j的使用
前言 距离上一篇文章又过去好长时间了,这段时间一直忙于工作,已经从net彻底转向Java了.工作也慢慢的步入正轨了,自己独自完成了一个小项目,不过工作中遇到了一些问题,还是得到了同学和同事的帮助.本来 ...
- JavaScript高级程序设计---学习笔记(四)
1.全局变量不能通过delete操作符删除,而直接在window对象上定义的属性可以. var age = 29; window.color = "red"; delete age ...
- 关于Form表单一些基础知识
1.两个重要属性: action:表单需要提交的服务器地址 method:表单提交数据使用的方法,get/post >>>get和post的区别 ①get传参使用URL传递,所有参数 ...
- C++中的继承详解(3)作用域与重定义,赋值兼容规则
作用域与同名隐藏 一样的,先上代码 1 class A 2 { 3 public: 4 int a_data; 5 void a() 6 { 7 cout << "A" ...
- jquery template.js前端模板引擎
作为现代应用,ajax的大量使用,使得前端工程师们日常的开发少不了拼装模板,渲染模板 在刚有web的时候,前端与后端的交互,非常直白,浏览器端发出URL,后端返回一张拼好了的HTML串.浏览器对其进行 ...
- jenkins+webhook+docker做持续集成
简介:我们现在都流行把项目封装成docker的镜像,不过实际用的时候就会发现很麻烦,我们每次更改代码了以后都要打包成docker容器 ,事实证明项目比较多的时候真的会让人崩溃,我这边用spring c ...
- JavaScript的XMLHttpRequest对象
ajax的核心技术是XMLHttpRequest对象,简称XHR. //支持IE7及更高的版本 function createXML() { if(typeof XMLHttpReqquest!=&q ...
- Nmap功能与常用命令
Nmap功能与常用命令 其基本功能有三个,一是探测一组主机是否在线:其次是扫描主机端口,嗅探所提供的网络服务:还可以推断主机所用的操作系统. Nmap可用于扫描仅有两个节点的LAN,直至500个节点以 ...
- 手机应用PC端演示工具介绍
写给公司内部用的,所以没什么含量,请免炮轰. 为什么需要在PC端演示? 在Android及IOS系统上开发的手机应用,往往由于设备的限制,无法在演示汇报的场合向在场的众人展示界面,如果有工具可以将手机 ...
- bzoj1798 [Ahoi2009]维护序列
Description 老师交给小可可一个维护数列的任务,现在小可可希望你来帮他完成. 有长为N的数列,不妨设为a1,a2,…,aN .有如下三种操作形式: (1)把数列中的一段数全部乘一个值; (2 ...