javascript设计模式之迭代器模式
迭代器模式分为内部迭代器和外部迭代器,内部迭代器就是在函数内部定义好迭代的规则,它完全接手整个迭代的过程,外部只需一次初始调用。
内部迭代器
以下自行实现的类似jquery中$.each()的each()函数就是内部迭代器
//实现一个jq的$.each()迭代器
vararr=[1,2,3,4,5,6,7,8]
vareach=function(arr,callback){
for(vari=0;i
内部迭代器在调用时非常方便,但是有一个缺点,就是无法同时迭代两个目标值,比如上述each函数就无法同时迭代两个数组。
对两个数组做相等性判断时,如果不改迭代器内部方法实现,只能通过each的回调函数进行实现,虽然能实现,但不是很优雅。
//对两个数组做相等性判断时,如果不改迭代器内部方法实现,只能通过each的回调函数进行实现,虽然能实现,但不是很优雅。
letcompare=function(ary1,ary2){
if(ary1.length!==ary2.length){
thrownewError('ar1和ary2长度不相等。')
}
each(ary1,function(i,n){
if(n!==ary2[i]){
thrownewError('ary1和ary2不相等。')
}
})
console.log('ary1和ary2相等!');
}
compare([1,2,3],[1,2,3])
外部迭代器
外部迭代器必须显示请求迭代下一个元素,虽然这样做会增加调用的复杂度,但也会增强迭代的操作灵活性,程序可以手工控制迭代的过程和顺序。
外部迭代器示例代码1:
letIterator=function(obj){
letcurrent=0;
letnext=function(){
current+=1
}
letisNotDone=function(){
returncurrent<=obj.length
}
letgetCurrentItem=function(){
returnobj[current];
}
return{
next,
isNotDone,
getCurrentItem
}
}
//外部迭代器通过next方法进行手工迭代
letarr=['a',true,false,'10',88,741]
letiterator1=Iterator(arr)
console.log(iterator1.getCurrentItem());//a
iterator1.next()
console.log(iterator1.getCurrentItem());//true
iterator1.next()
console.log(iterator1.getCurrentItem());//false
iterator1.next()
console.log(iterator1.getCurrentItem());//'10'
//改写compare函数
letcompare=function(iterator1,iterator2){
while(iterator1.isNotDone()&&iterator2.isNotDone()){
if(iterator1.getCurrentItem()!==iterator2.getCurrentItem()){
thrownewError('iterator1和iterator2不相等。')
}
iterator1.next()
iterator2.next()
}
console.log('iterator1和iterator2相等。');
}
letiterator1=Iterator([1,2,3,4])
letiterator2=Iterator([1,2,3,4,5])
compare(iterator1,iterator2)//iterator1和iterator2不相等。
外部迭代器示例代码2:
letIterator=function(array){
letnextIndex=0;
return{
next:function(){
returnnextIndex
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。