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)
}

es6之Iterator的更多相关文章

  1. ES6的Iterator,jquery Fn

    ES6的Iterator对象详解 Iterator实现原理 创建一个指针对象,指向当前数据结构的起始位置.也就是说,遍历器对象本质上,就是一个指针对象. 第一次调用指针对象的next方法,可以将指针指 ...

  2. ES6的Iterator遍历器

    JS表示集合的对象主要有Array.Set.Object.Map,在以前,遍历它们需要使用2种不同的方法,而现在,JS提出了Iterator机制,可以给不同的数据结构提供统一的遍历方法,就是for…o ...

  3. es6之iterator,for...of

    遍历器(Iterator)是一种统一的接口机制,来处理所有不同的数据结构. JavaScript 原有的表示“集合”的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和 ...

  4. JS的ES6的iterator

    一.iterator 1.概念:iterator是一种接口机制,为各种不同的数据结构提供统一的访问机制. 2.作用: 为各种数据结构,提供一个统一的.简便的访问接口: 使得数据结构的成员能够按某种次序 ...

  5. 前端知识点回顾之重点篇——ES6的Iterator和Generator

    Iterator 迭代器是一种接口.是一种机制. 为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员). Iter ...

  6. ES6的 Iterator 遍历器到底是什么?

    这节课要讲的是ES6中的Iterator. for...of为啥不遍历Object对象 第十三节我们讲了简单又实用的for...of,我们可以使用它来遍历数组,字符串,Set和Map结构,但是有没有发 ...

  7. 切图崽的自我修养-[ES6] 迭代器Iterator浅析

    Iterator 这真是毅种循环 Iterator不是array,也不是set,不是map, 它不是一个实体,而是一种访问机制,是一个用来访问某个对象的接口规范,为各种不同的数据结构提供统一的访问机制 ...

  8. Es6 Symbol.iterator

    Symbol.iterator 为每一个对象定义了默认的迭代器.该迭代器可以被 for...of 循环结构使用. --描述 当需要迭代一个对象的时候(比如在 for...of 循环的开始时),它的 @ ...

  9. es6(14)--iterator for ...of循环

    //iterator for ...of循环 { let arr=['hello','world']; let map=arr[Symbol.iterator](); console.log(map. ...

随机推荐

  1. TensorFlow学习笔记(一)--windows系统安装配置

    1.关于Tensorflow 国际惯例,先来个总体的简要介绍,摘自一个很强大的TensorFlow中文学习网站(http://www.tensorfly.cn/)的简介 TensorFlow™ 是一个 ...

  2. LDPC知识点

    LDPC:low Density Parity Check BCH:以前NAND的纠错 80s TLC以镁光都是以LDPC纠错. 对比: BCH:超过阈值就绝对纠正不回来了. LDPC:纠正的结果是一 ...

  3. PAT 1151 LCA in a Binary Tree[难][二叉树]

    1151 LCA in a Binary Tree (30 分) The lowest common ancestor (LCA) of two nodes U and V in a tree is ...

  4. CTreeView 的教程

    整个网上搜了一圈没有好的CTreeView 的教程,所以自己谢谢看. CTreeView 是什么? C打头的东西当然是一个类了. 有类就有继承,他的继承关系如下. 有个东西和他比较像 叫CTreeCt ...

  5. crm 使用stark组件

    # Create your models here. from django.db import models class Department(models.Model): "" ...

  6. Django:学习笔记(9)——用户身份认证

    Django:学习笔记(9)——用户身份认证 User

  7. MongoDB操作库/表

    假设你已经安装好了MongoDB 不使用权限启动 mongod --fork --bind_ip 0.0.0.0 --dbpath=/mydata/mongo/data --logpath=/myda ...

  8. vue父子组件传值加例子

    例子:http://element-cn.eleme.io/#/zh-CN/component/form         上进行改的 父传子:用prop:子组件能够改变父组件的值,是共享的,和父操作是 ...

  9. iOS开发之XMPPFramework环境搭建和配置

    1.mysql数据库安装和配置 官方下载地址:http://www.mysql.com/downloads/ 百度云盘地址: 安装软件参考:http://www.cnblogs.com/macro-c ...

  10. HCNP学习笔记之子网划分 VLSM CIDR

    子网划分.VLSM可变长子网掩码.CIDR无类域间路由是学习网络知识或者说是学习路由知识所必备的,但很多朋友说这三者理论性太强了,不好掌握.本文将结合实例讲解子网划分的方法并对VLSM和CIDR进行简 ...