迭代器模式

内部迭代器和外部迭代器

内部迭代器

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