JS表示集合的对象主要有Array、Set、Object、Map,在以前,遍历它们需要使用2种不同的方法,而现在,JS提出了Iterator机制,可以给不同的数据结构提供统一的遍历方法,就是for…of。换句话说,只有部署了Iterator的数据才能用for…of遍历。

Iterator的遍历过程是这样的:

(1)创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。

(2)第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。

(3)第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。

(4)不断调用指针对象的next方法,直到它指向数据结构的结束位置。

每一次调用next方法,都会返回数据结构的当前成员的信息。具体来说,就是返回一个包含valuedone两个属性的对象。其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。

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

默认部署了Iterator的数据有

-Array

-Map

-Set

-String

-TypedArray

-arguments

-NodeList 对象

一个对象要被for…of遍历,必须部署Iterator,或者在其原型上部署Iterator,普通对象并没有部署Iterator,如果用for…of遍历,会抛出“not iterable”错误

然而,一个类似于数组的普通对象直接调用数组的Symbol.iterator,也是可以用for…of遍历的

let iterable = {
0: 'a',
1: 'b',
2: 'c',
length: 3,
[Symbol.iterator]: Array.prototype[Symbol.iterator]
};
for (let item of iterable) {
console.log(item); // 'a', 'b', 'c'
}

需要注意的是,“类似于数组”这个条件,不仅仅要以数字为索引,length属性也必不可少

两个条件中,任何一条不满足(就是普通对象),调用数组的Symbol.iterator是行不通的

那么普通对象到底要怎样才能被for…of遍历?

一是利用Object.keys得到对象的键名然后遍历这个数组

for (var key of Object.keys(someObject)) {
console.log(key + ': ' + someObject[key]);
}

Iterator的遍历过程看着像Generator,Generator可以很简单就实现Iterator接口,所以第二种方法就是利用Generator方法将对象包装一下

function* entries(obj) {
for (let key of Object.keys(obj)) {
yield [key, obj[key]];
}
} for (let [key, value] of entries(obj)) {
console.log(key, '->', value);
}

总结参考:http://es6.ruanyifeng.com/#docs/iterator

最新文章

  1. java.lang.String.getBytes(String charsetName)方法实例
  2. .net 下新版highcharts本地导出图片bug处理
  3. WCF服务寄宿应用程序
  4. (ASP.NET)总结MVC中@Html表单用法
  5. 将UTF8编码转化为中文 - NSString方法
  6. AngularJS进阶(二十七)实现二维码信息的集成思路
  7. windows下consul利用json文件注册服务
  8. matplotlib 初次编译无法运行
  9. 大数据基础Hadoop 2.x入门
  10. 2018-01-04 浅尝The Little Prover一书, 重逢Chez Scheme
  11. C++:UNREFERENCED_PARAMETER用法
  12. 浅谈Session与Cookie的区别与联系
  13. 2015306 白皎 《网络攻防》EXP6 信息搜集与漏洞扫描
  14. Entity Framework 6 (7) vs NHibernate 4: DDD perspective(纯净DDD很难很难...)
  15. 【学习笔记】Python基础教程学习笔记
  16. 谈谈http与https
  17. css样式记忆
  18. C#值类型装箱后能改变其值吗
  19. Cognos创建Oracle数据源错误以及客户端生成加密信息错误
  20. Ubuntu adb devices :???????????? no permissions (verify udev rules) 解决方法

热门文章

  1. 201521123051 《Java程序设计》 第二周学习总结
  2. 201521123062 《Java程序设计》第14周学习总结
  3. HTTP请求的header头解析
  4. Hibernate第六篇【多对多映射、一对一映射】
  5. Intellij idea使用Junit
  6. 接口测试入门(5)----新框架重构,使用轻量级的HTTP开发库 Unirest
  7. JavaScript中的位置屬性
  8. 国外支付PayPal
  9. 使用 Dawn 构建 React 项目
  10. hibernate学习手记(1)