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

最新文章

  1. Best Time to Buy and Sell Stock III [LeetCode]
  2. HDU5863 cjj&#39;s string game(DP + 矩阵快速幂)
  3. Spring 中注入 properties 中的值
  4. Tutorial: Facebook analytics using Power BI Desktop
  5. Effective C++学习笔记 条款05:了解C++默默编写并调用的哪些函数
  6. HDU 2594 (简单KMP) Simpsons’ Hidden Talents
  7. Android隐藏输入法键盘(hideSoftInputFromInputMethod没有效果)
  8. 组织http请求
  9. spring注解方式 idea报could not autowire,eclipse却没有问题
  10. C#l连接OPC进行数据交互
  11. redis运维的一些知识点
  12. Petya勒索病毒疫苗出现,分分钟让电脑对病毒免疫
  13. Linux完整备份工具 - dump, restore(现在基本不用这两个)
  14. 转载及总结:cron表达式详解,cron表达式写法,cron表达式例子
  15. CentOS上升级gcc编译器使支持C++11
  16. fastjson生成json时Null属性不显示 (转)
  17. (6)time&amp;datetime(时间模块)
  18. 编程算法 - 数字在排序数组中出现的次数 代码(C)
  19. Mybatis 中延时加载
  20. Windows7使用无线网卡建立WiFi热点

热门文章

  1. 搞定:Enter passphrase for key提示
  2. 什么东西那么吸引别人的眼球!! -----------------------------------for循环
  3. WebService基础学习(一)&mdash;基础知识
  4. 关于IE兼容问题
  5. 修改Gradle 和Maven本地仓库的位置 方法
  6. 500. Keyboard Row
  7. [转]DevExpress GridControl 关于使用CardView的一点小结
  8. CSS清除float浮动
  9. JS判断值是否是正数
  10. js日期转化(计算一周的日期)