迭代器模式
迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示
迭代器模式可以把迭代过程中从业务逻辑分离出来,从而不用关心对象的内部构造,也可以按照顺序访问其中的每个元素。
实现自己的each函数,each函数接收两个参数,一个是被循环的数组,第二个是循环中的每一步后将被触发的回调函数。
//内部迭代器
var each = function(ary, callback) {
for(var i=0, l=ary.length;i<l;i++){
callback(ary[i],i,ary[i]);
}
}
each([1,2,3], function(i,n){
console.log(i, n);
})
迭代器分为内部迭代器和外部迭代器,如上的例子属于内部迭代器,即是不关心内部实现,已经规定了规则,只需要一次性初始调用。这也带来了一个缺点,就是无法同时遍历两个数组。
外部迭代器 必须显式地请求迭代下一个元素。 这样一来,增加了一些调用的复杂度,但相对也增强了迭代器的灵活性,我们可以手工控制迭代过程或顺序
var Iterator = funciton(obj) {
var current = 0;
var next = function() {
current += 1;
}
var isDone = function() {
return current > obj.length;
}
var getCurrItem = function() {
return obj[current];
}
return {
next: next,
isDone: isDone,
getCurrItem: getCurrItem
}
}
比较函数
var compare = function(iterator1, iterator2){
while(!iterator1.isDone() && !iterator2.isDone()) {
if (iterator1.getCurrItem() !== iterator2.getCurrItem()) {
throw new Error(‘iterator1 和 iterator2不相等’);
}
iterator1.next();
iterator2.next();
}
alert(‘iterator1 和 iterator2相等’);
}
var iterator1 = Iterator([1,2,3]);
var iterator2 = Iterator([1,2,3]);
compare(iterator1, iterator2);// 输出: iterator1 和 iterator2 相等
外部迭代器虽然调用方式相对复杂,但它的适用面更广,也能满足更多变的需求。 内部迭代器和外部迭代器在实际生产中没有优劣之分,究竟使用哪个要根据需求场景而定。