迭代器模式
内部迭代器和外部迭代器
内部迭代器
自己实现一个 each 函数,each 函数接受 2 个参数,第一个为被循环数组,第二个为循环要触发的回调函数。
var each = function(arr,callback){
for(var i=0,l=arr.length;i<l;i++){
callback.call(arr[i],i,arr[i])//需要绑定this为被遍历项
}
}
each([1,2,3],function(i,n){
console.log([i,n])
})//[0,1] [1,2] [2,3]
内部迭代器在调用的时候很方便。外界不用关心迭代器的实现,这也是内部迭代器的缺点,内部的迭代规则已经被限定。
外部迭代器
外部迭代器必须显式的请求迭代下一个元素
外部迭代器增加了调用的复杂度,但也增加了迭代器的灵活性,我们可以手工控制迭代的过程或者顺序。
function Iterator(obj) {
var current = 0
var next = function() {
current += 1
}
var isDone = function() {
return !(current < obj.length)
}
var getItem = function() {
return obj[current]
}
return {next, isDone, getItem}
}
例子:判断两个数组的值是否完全相等
var iterator1 = Iterator([1, 2, 3, 4,5]),
iterator2 = Iterator([1, 2, 3, 4]);
var compare = function (item1, item2) {
while (!item1.isDone() || !item2.isDone()) {
console.log(item1.getItem(), item2.getItem())
if (item1.getItem() !== item2.getItem()) {
throw new Error("不相等")
}
item1.next()
item2.next()
}
console.log("相等")
}
compare(iterator1, iterator2)//相等