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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。