ECMAScript 6 —— 知识点(十一) Iterator

一、迭代器的工作原理
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);
}

猜你喜欢

转载自blog.csdn.net/wuxinwudai/article/details/80841617