1.什么是Iteratores6
遍历器(Iterator)它是一种接口,为各类不一样的数据结构提供统一的访问机制。任何数据结构只要部署 Iterator接口,就能够完成遍历操做(即依次处理该数据结构的全部成员)。数组
2.Iterator的做用bash
Iterator 的做用有三个:一是为各类数据结构,提供一个统一的、简便的访问接口;二是使得数据结构的成员可以按某种次序排列;三是ES6创造了一种新的遍历命令for...of循环,Iterator 接口主要供for...of消费。数据结构
3.过程函数
(1)建立一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。ui
(2)第一次调用指针对象的next方法,能够将指针指向数据结构的第一个成员。spa
(3)第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。prototype
(4)不断调用指针对象的next方法,直到它指向数据结构的结束位置。指针
var it = makeIterator(['a', 'b']);
it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{value: undefined, done: true};
}
};
}
/*
每一次调用next方法,都会返回数据结构的当前成员的信息。
具体来讲,就是返回一个包含value和done两个属性的对象。
其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。
*/
复制代码
4.默认 Iterator 接口code
一个数据结构只要具备Symbol.iterator属性,就能够认为是可遍历的。
const obj = {
// Symbol是es6里一个特殊的类型,因此放在[]里。
[Symbol.iterator] : function () { // Symbol.iterator是一个方法
return { // 返回一个遍历器对象
next: function () { // 遍历器对象具备next方法
return { // 返回包含当前成员的对象
value: 1,
done: true
};
}
};
}
};
复制代码
原生具有Iterator接口的数据类型有Array,Map,Set,String,TypedArray,函数的 arguments 对象,NodeList 对象。
对象(Object)之因此没有默认部署 Iterator 接口,是由于对象的哪一个属性先遍历,哪一个属性后遍历是不肯定的,须要开发者手动指定。
// 类数组对象要具备iterator接口,简单的办法是
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
// 或者
NodeList.prototype[Symbol.iterator] = [][Symbol.iterator];
复制代码
5.使用的场合
for ... of ...
数组的结构赋值
展开运算符 '...'
yield*
...
6.Iterator 接口与 Generator 函数
let myIterable = {
[Symbol.iterator]: function* () {
yield 1;
yield 2;
yield 3;
}
}
[...myIterable] // [1, 2, 3]
// 或者采用下面的简洁写法
let obj = {
* [Symbol.iterator]() {
yield 'hello';
yield 'world';
}
};
for (let x of obj) {
console.log(x);
}
// "hello"
// "world"
复制代码
7.return()方法
return方法的使用场合是,若是for...of有循环出错,或者有break语句,就会调用return方法。若是一个对象在完成遍历前,须要清理或释放资源,就能够部署return方法。