迭代器模式

一概念及类别:
1.提供一种方法顺序,访问聚合对象的各个元素,而又不暴露该对象的内部表示
为遍历不同数据结构的 “集合” 提供统一的接口
2.按业务逻辑分内部迭代器和外部迭代器
迭代器模式
文章图片

forEach示例:

Array.prototype.forEach_a = function(cb){ //console.log("this=",this); let len = this.length; for(var i=0; i

外部迭代器示例:
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='https://www.it610.com/article/,ite1.isDone().value,'ite2Value='https://www.it610.com/article/,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);

    推荐阅读