一、定义
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象
的内部表示。
二、实现
var each = function (ary, callback) {
for (var i = 0, l = ary.length; i < l; i++) {
callback.call(ary[i], i, ary[i]); // 把下标和元素当作参数传给 callback 函数
}
};
each([1, 2, 3], function (i, n) {
console.log([i, n]);
});
2.1 内部迭代器
上面的例子,其实就是内部迭代器,each函数里面已经定义好了迭代规则。
2.2 外部迭代器
外部迭代器模式中,迭代规则在迭代器外部,必须显示的请求迭代下一个元素。
var Iterator = function (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();
}
console.log('iterator1 和 iterator2 相等');
}
var iterator1 = Iterator([1, 2, 3]);
var iterator2 = Iterator([1, 2, 3]);
compare(iterator1, iterator2); // 输出:iterator1 和 iterator2 相等
三、迭代类数组对象和字面量对象
迭代器模式不仅可以迭代数组,还可以迭代一些类数组的对象。for in 语句可以用来迭代普通字面量对象的属性。
$.each = function (obj, callback) {
var value,
i = 0,
length = obj.length,
isArray = isArraylike(obj);
if (isArray) { // 迭代类数组
for (; i < length; i++) {
value = callback.call(obj[i], i, obj[i]);
if (value === false) {
break;
}
}
} else {
// for in 迭代 object 对象
for (i in obj) {
value = callback.call(obj[i], i, obj[i]);
if (value === false) {
break;
}
}
}
return obj;
};
其他迭代器。
倒序迭代器:就是迭代顺序是反方向的。
中止迭代器:迭代器可以像普通 for 循环中的 break 一样,提供一种跳出循环的方法