定義
提供一種方法順序訪問一個聚合對象中的每個元素,而又不需要暴露該對象的內部表示。
要點
- 迭代器模式可以把迭代的過程從業務邏輯中分離出來。
- 迭代器可以分為內部迭代器和外部迭代器。
- 內部迭代器已經定義好了迭代規則,它完全接手整個迭代過程,外部只需要一次初始調用。
- 外部迭代器必須顯示地請求迭代下一個元素。它增加了一些調用的複雜度,但相對也增強了迭代器的靈活性。
- 從一般迭代器的實現中可以看出,只要被迭代的聚合對象擁有 length 屬性而且可以用下標訪問元素,那它就可以被迭代。
- JavaScript中,for in 語句可以迭代普通字面量對象的屬性。jQuery 中的 $.each 函數封裝了類數組對象和字面量對象的迭代行為。
- 中止迭代器:$.each 是約定如果回調函數的執行結果返回 false,則提前中止循環。
- 迭代器的應用場景之一是在某些情況下取代函數中的多個 if else 條件分支。
核心代碼
\\ 內部迭代器
var each = function(arr, callback) {
for (var i = 0, l = arr.length; i < l; i++) {
if (callback(i, arr[i]) === false) {
break;
}
}
};
each([1, 2, 3], function(i, n) {
// callback function
});
\\ 外部迭代器
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()) {
console.log('Not Equal.');
return;
}
iterator1.next();
iterator2.next();
}
console.log('Equal.');
};
var iterator1 = Iterator([1, 2, 3]);
var iterator2 = Iterator([1, 2, 3]);
compare(iterator1, iterator2);
网友评论