第一部分、概念
- Iterator(遍历器)的概念:遍历器是一种接口,为各种不同的数据结构提供统一的访问机制。
- 3个作用:为各种数据结构提供一个统一的、简便的访问接口;使得数据结构成员能够按照某种次序排列;for…of
- Iterator遍历过程:创建一个指针对象,指向当前数据结构的起始位置,接下来每次调用next(),就将指针指向下一个数据结构,直到指向数据结构的结束为止。返回的是一个含有value和done两个属性的对象。
- Iterator只是把接口规格加到了数据结构上,遍历器与所遍历的数据结构实际上是分开的。也就是说可以写出没有对应数据结构的对象,或者说用遍历器对象模拟出数据结构
- 原生具备Iterator接口的数据结构:Array、Map、Set、String、TypedArray,arguments,NodeList
- 调用Iterator接口的场合:解构赋值、扩展运算符、yield、任何接受数组作为参数的场合(for…of、Array.from、Map、Set,WeakSet、WeakMap、Promise.all、Promise.race)
- Iterator接口的最简单实现式是Generator函数。 ```javascript var myIterator={}; myIterator[Symbol.iterator]=function* (){ yield 1: yield 2; yield 3; }
let obj={
* [Symbol.iterator](){
yield 'hello';
yield 'hello';
}
} ```
- 遍历器对象的return(for…of提前退出,break,continue,必须返回一个对象) throw
- for…of循环:部署了Symbol.iterator属性,就可以使用for…of循环遍历他的成员,例如(数组,Set,Map,数组类型的对象,arguments对象,DOMList对象,字符串)
- Set和Map遍历顺序是添加的顺序
几种遍历语法的比较
- for循环写法比较麻烦,随后有了forEach,问题在于中途无法跳出循环,break和return无效果,for…in循环遍历键名,几个缺点是键名是字符串,除了遍历数字键名还会遍历原型链上的键,某些情况顺序不固定,for…in主要是为了对象设计。对于for…of,语法简洁,没有for…in的缺点,不同于forEach,可以使和break、return、continue配合,提供了遍历所有数据结构的同意操作接口