迭代器模式

迭代器模式

内部迭代器和外部迭代器

内部迭代器

自己实现一个 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)//相等