一概念及类别:

1.提供一种方法顺序,访问聚合对象的各个元素,而又不暴露该对象的内部表示
为遍历不同数据结构的 “集合” 提供统一的接口

2.按业务逻辑分内部迭代器和外部迭代器
image.png

forEach示例:

Array.prototype.forEach_a = function(cb){
    //console.log("this=",this);
    let len = this.length;
    for(var i=0;i<len;i++){
        // cb(this[i],i);
        cb.call(this,this[i],i)
    }
}
var arr=[3,4,5,6,7];
arr.forEach_a(function(value,index){
    console.log(index,value)
})

外部迭代器示例:

let arr=['aaa','bbb','ccc'];
function makeIterator(array){
    let nextIndex = 0;
    return {
        next:function(){
            return nextIndex < array.length ? {value:array[nextIndex++],done:false} :{value:undefined,done:true}
        }
    }
}
let res = makeIterator(arr)
console.log(res.next());
console.log(res.next());
console.log(res.next());
console.log(res.next());

1.创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
2.第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。
3.第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。
4.不断调用指针对象的next方法,直到它指向数据结构的结束位置。

二.应用场景

不想暴露数聚合对象内部结构,提供一个统一的遍历接口
场景举例(比较两个数组是否相等):

function iterator(arr){
    let i = 0;
    return {
        next:function(){
            i++;
        },
        isDone:function(){
            if(i < arr.length){
                return {value:arr[i],done:false};
            }else{
                return {value:undefined,done:true};
            };
        },
       
    }
}
function compare(ite1,ite2){
    while(!ite1.isDone().done && !ite2.isDone().done){//循环判断两个迭代器是否遍历完
        //console.log(ite1.isDone().done,ite2.isDone().done);
        console.log('ite1Value=',ite1.isDone().value,'ite2Value=',ite2.isDone().value);
        if(ite1.isDone().value !== ite2.isDone().value){
            console.log ( '不相等' );
            return;
        }else{
            ite1.next();
            ite2.next();
        }
        
     }
     console.log('相等');
}
var i1 = new iterator([1,2,5,4]);
var i2 = new iterator([1,2,3,4]);


compare(i1,i2);

Delia
75 声望3 粉丝

路漫漫其修远兮,吾将上下而求索。