一、迭代器的工作原理
1. 创建一个指针对象,志向当前数据结构的起始位置;
2. 每次(第n次)调用该指针对象的next方法时,指针指向数据结构的第n个成员
3. 不断调用指针对象的next方法,直到它指向数据结构的结束位置。
4. 具备Iterator 接口的对象可以被for…of 循环遍历。ES6中数组、Set和 Map结构原生具备 Iterator 接口。
let arr = ['a','b','c'];
let iter = arr[Symbol.iterator];
iter.next();//{value:'a',done:false}
iter.next();//{value:'b',done:fasle}
iter.next();//{value:'c',done:fasle}
iter.next();//{value:undefined,done:true}
class RangeIterator{
constructor(strat,stop){
this.value = start;
this.stop = stop;
}
[Symbol.iterator](){ return this; }
next(){
var value = this.value;
if(value < this.stop){
this.value++;
return {done:false,value:value};
}else{
return {done:true,value:undefined};
}
}
}
function range(start,stop){//变成Python了。。。。
return new RangeIterator(start,stop);
}
for(var value of range(0,3)){
console.log(value);
}
//-------------- Iterator 接口调用的场合 --------------------
//1.结构赋值
let set = new Set(['a','b','c']);
let [x,y] = set;
let [first,...rest] = set;
console.log(x);//a
console.log(y);//b
console.log(first);//a
console.log(rest);// ["b", "c"]
//2.扩展运算符...
var str = 'hello';
console.log([...str]);//["h", "e", "l", "l", "o"]
let arr = ['b','c'];
console.log(['a',...arr,'d']);//["a", "b", "c", "d"]
//3.yield
function *generator(){
yield 1;
yield 2;
yield* ['a','b','c'];
}
var iterator = generator();
var item = iterator.next();
while(item && !item.done) {
console.log(item);
item = iterator.next();
}
//4. 数组被遍历的时候
二、Iterator 的 return 和 throw
function readLinesSync(file){
return{
next(){
if(file.isAtEndOfFile()){
file.close();
return {done:true};
}
}
},
return(){
file.close();
return {done:true};
}
}
三、for…of
const arr = ['red','green','blue'];
let iteratro = arr[Symbol.iterator]();
for(let v of arr){
console.log(v);//'red' 'green' 'blue',取得值
}
for(let v of iterator){
console.log(v);
}
arr.forEach((ele,index)=>{
console.log(ele);
console.log(index);
});
for(let a in arr){
console.log(a);//0 1 2,取得键或索引
}
四、Set 和 Map
var map = new Map();
map.set('name','Tom');
map.set('age',18);
for(var [name,value] of map){
console.log(name + ' : ' + value);
}