一概念及类别:
1.提供一种方法顺序,访问聚合对象的各个元素,而又不暴露该对象的内部表示
为遍历不同数据结构的 “集合” 提供统一的接口
2.按业务逻辑分内部迭代器和外部迭代器
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);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。