什么是迭代器模式
它是指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。
- jq中的迭代器
$.each( [1,2,3], function(i, v) {
//xxx
console.log(this);// ==> 等价于v
});
- 自己实现一个简单的迭代器
var each = function(arr, fn) {
for(var i = 0; i < arr.length; i++){
if(fn.call(arr[i], i, arr[i]) === false){
break; //模仿jq,在jq中each返回false是就会中断迭代
};//这里当调用this的的时候就是arr[i],同上面jq中的用法
}
},
迭代器的分类
- 内部迭代器
前面的each的实现就是内部迭代器,它在内部已经定义好了规则,完全接手整个规则,外部只需要一次调用。
但是有一个需求比较两个数组是否完全相等,each方法就不那么好用了。
var compare = function(arr1, arr2){
if(arr1.length !== arr2.length){
throw new Error("不等");
return false;
}
each(arr1, function(i, v){
if(v !== arr2[i]){
throw new Error("不等");
}
});
}
compare( [1,2,3], [4,5,6]);//
- 外部迭代器
外部迭代器必须显式地请求迭代下一个元素。
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 ];
};
var length = function(){
return obj.length;
};
return {
next: next,
isDone: isDone,
getCurrItem: getCurrItem,
length: length
}
};
var compare = function( iterator1, iterator2 ){
if(iterator1.length !== iterator2.length){
alert ( 'iterator1 和 iterator2 不相等' );
return false;
}
while( !iterator1.isDone() && !iterator2.isDone() ){
if ( iterator1.getCurrItem() !== iterator2.getCurrItem() ){
throw new Error ( 'iterator1 和 iterator2 不相等' );
}
iterator1.next();
iterator2.next();
}
alert ( 'iterator1 和 iterator2 相等' );
}
var iterator1 = Iterator( [ 1, 2, 3, 2 ] );
var iterator2 = Iterator( [ 1, 2, 3 ] );
compare( iterator1, iterator2 ); // 输出: iterator1 和 iterator2 不相等
可以使用在:
在不同的浏览器环境下,选择的上传方式是不一样的。因为使用浏览器的上传控件进行上传速度快,可以暂停和续传,所以我们首先会使用
- 控件上传。如果浏览器没有安装上传控件,则使用
- Flash 上传, 如果连Flash 也没安装,那就只好使用
- 浏览器原生的表单上传了。
var iteratorUploadObj = function(){
for ( var i = 0, fn; fn = arguments[ i++ ]; ){
var uploadObj = fn();
if ( uploadObj !== false ){
return uploadObj;
}
}
};
var uploadObj = iteratorUploadObj(
getActiveUploadObj,
getFlashUploadObj,
getFormUpladObj
);
//由于只有这几种情况,所以就会匹配到一种,然后直接执行即可。
网友评论