第7章迭代器模式
7.1 jQuery中的迭代器
$.each([1,2,3],function(){
console.log('当前下标为'+i);
console.log('当前值为'+n);
})
7.2 实现自己的迭代器
var each = function(ary,callback){
for(var i=0,l=ary.length;i<l;i++){
callback.call(ary[i],i,ary[i]);
}
};
each([1,2,3],function(i,n){
alert([i,n]);
});
7.3 内部迭代和外部迭代
1内部迭代器
内部已经定义好了迭代规则
var compare = function(arr1,arr2){
if(arr1.length!==arr2.length){
throw new Error('arr1和arr2不相等');
}
each(arr1,function(i.n){
if(n!==arr2[i]){
throw new Error('arr1和arr2不相等');
}
})
alert('arr1和arr2相等');
}
compare([1,2,3],[1,2,4]);
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();
}
alert('iterator1和iterator2相等');
}
var iterator1 = Iterator([1,2,3]);
var iterator2 = Iterator([1,2,3]);
compare(iterator1,iterator2);
7.4 迭代类数组对象和字面量对象
类数组对象:比如arguments,{'0':'a','1':'b'}等
for in语句可以迭代普通字面量对象的属性
jQuery中提供了$.each函数封装各种迭代行为:
$.each = function(){
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(i in obj){
value = callback.call(obj[i],i,obj[i]);
if(value === false){
break;
}
}
}
return obj;
};
7.5 倒序迭代器
var reverseEach = function(arr,callback){
for(var l = arr.length-1;l>=0;l--){
callback(l,arr[l]);
}
}
reverseEach([0,1,2],function(i,n){
console.log(n);
});
7.6 中止迭代器
var each = function(ary,callback){
for(var i = 0, l = ary.length; i < l; i++){
if(callback(i,ary[i])===false){
break;
}
}
};
each([1,2,3,4,5],function(i,n){
if( n > 3 ){
return false;
}
console.log(n);
})