Iterator的概念
遍历器(Iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构,只要部署Iterator接口,就可以完成遍历操作
其遍历过程如下:
1、创建一个指针对象,指向当前数据结构的起始位置。也就是说遍历器对象本质上就是一个指针对象。
2、调用指针对象的next方法,可以将指针指向数据结构的下一个成员,返回数据接口的当前成员的信息,具体来说就是返回一个具有value和done两个属性的对象。value是成员值,done是个boolean值,表示遍历是否结束。
默认Iterator接口
一个数据结构只要具有Symbol.iterator属性,就可以认为是可遍历的。
const obj = {
[Symbol.iterator]:function(){
return {
next:function(){
return{
value:1,
done:true
}
}
}
}
}
原生具备Iterator接口的数据结构如下:
Array、Map、Set、String、TypedArray、函数的arguments对象、NodeList对象
以数组为例:
let arr = ['a','b','c'];
let iter = arr[Symbol.iterator]();
iter.next(); //{value:'a',done:false}
iter.next(); //{value:'b',done:false}
iter.next(); //{value:'c',done:false}
iter.next(); //{value:undefined,done:true}
调用Iterator接口的场合
1、解构赋值
2、扩展运算符
3、yield*
Iterator接口和Generator函数
Symbol.iterator方法的最简单实现还是使用Generator函数,点击查看Generator函数详情
var obj = {
[Symbol.iterator]:function*(){
yield 1;
yield 2;
yield 3;
return;
}
}
[...boj]; //[1,2,3];
//简洁写法
var obj = {
* [Symbol.iterator](){
yield 1;
yield 2;
}
}
for...of
一个数据结构只要部署了Symbol.iterator属性,就被视为具有iterator接口,就可以用for...of遍历它的成员