定义:迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。
迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也
可以顺序访问其中的每个元素。
1. 内部迭代器
内部迭代器在调用的时候非常方便,外界不用关心迭代器的内部的实现,跟迭代器的交互也仅仅是一次初始
调用,但这也刚好是内部迭代器的缺点。由于内部迭代器的迭代规则已经被提前规定,某些场景就无法适用
了,Array.proptype.forEach 就是一个数组迭代器。
数组迭代器实现
const each = (ary, callback) => {
for(let i = 0; i < ary.length; i++) {
callback.call(ary[i], i, ary[i]);
}
};
each([1, 2, 3 ], (i, n) => {
console.log([i, n]);
});
2. 外部迭代器
外部迭代器必须显式地请求迭代下一个元素。外部迭代器增加了一些调用的复杂度,但相对也增强了迭代器的
灵活性,我们可以手工控制迭代的过程或者顺序。
外部迭代器的实现
const Iterator = (obj) => {
let current = 0;
const next = () => current += 1;
const isDone = () => current >= obj.length;
const getCurrItem = () => obj[current];
const length = obj.length;
return {
next,
isDone,
getCurrItem,
length
};
};
3. 倒序迭代器
倒序迭代器实现
const reverseEach = (ary, callback) => {
for (let i = ary.length-1; i >= 0; i--){
callback(i, ary[i]);
}
};
reverseEach([0,1,2],(i, n)=>{
console.log(n); // 2, 1, 0
});
4. 中止迭代器
迭代器可以像普通for循环中的break一样,提供一种跳出循环的方法,我们可以约定回调函数返回false
时,提前终止迭代。
中止迭代器实现
const each = (ary, callback) => {
for(let i = 0; i < ary.length; i++) {
if( callback( i, ary[i]) === false){
break;
}
}
};
each([1, 2, 3, 4, 5 ], (i, n) => {
if( n > 3) return false;
console.log(n); // 1, 2, 3
});
标签:const,迭代,ary,javascript,callback,length,each,设计模式
From: https://www.cnblogs.com/xiaodi-js/p/17181611.html