迭代器是指通过一种形式依次遍历数组,对象,或者类数组结构中的每个元素. 常见的有jquery中的each方法, ES5自带的forEach方法. 下面我们就来自定义一个类似jquery或者ES5的迭代器方法

1         function each( arr, fn ) {
2 for( var i = 0, len = arr.length; i < len; i++ ){
3 fn.call( arr, arr[i], i );
4 }
5 }
6 each( [ 'zhangsan', 'lisi', 'ghostwu' ], function( val, key ){
7 console.log( this, val, key );
8 });

输出结果:

["zhangsan", "lisi", "ghostwu"] "zhangsan" 0
["zhangsan", "lisi", "ghostwu"] "lisi" 1
["zhangsan", "lisi", "ghostwu"] "ghostwu" 2

二、利用迭代器,判断两个数组的长度和对应的位置的值是否相等

         function each( arr, fn ) {
for( var i = 0, len = arr.length; i < len; i++ ){
fn.call( arr, arr[i], i );
}
}
function isEqual( arr1, arr2 ){
var flag = false;
if( arr1.length != arr2.length ){
throw new Error( '数组的长度不相等' );
}
each( arr1, function( val, key ){
if ( val != arr2[key] ) {
throw new Error('数组的第' + (key+1) + '项不相等');
}
});
return true;
}
console.log( isEqual( [ 10, 20, 30 ], [ 10, 20, 30 ] ) );

三、另一种迭代器

         function Iterator( obj ){
var curInd = 0;
var next = function(){
curInd += 1;
};
var isDone = function(){
return curInd >= obj.length;
};
var current = function(){
return obj[curInd];
};
return {
next : next,
isDone : isDone,
current : current
};
}
var obj = null;
obj = Iterator( [ 10, 20, 30 ] );
console.log( obj.current(), obj.isDone() ); // 10, false
obj.next();
console.log( obj.current(), obj.isDone() ); // 20, false
obj.next();
console.log( obj.current(), obj.isDone() ); // 30, false
obj.next();
console.log( obj.current(), obj.isDone() ); // undefined, true

四,使用上面的迭代器,改写两个数组的比较

         function Iterator( obj ){
var curInd = 0;
var next = function(){
curInd += 1;
};
var isDone = function(){
return curInd >= obj.length;
};
var current = function(){
return obj[curInd];
};
return {
next : next,
isDone : isDone,
current : current
};
} function compare( it1, it2 ){
while( !it1.isDone() && !it2.isDone() ){
if( it1.current() != it2.current() ){
throw new Error( '数组不相等' );
}
it1.next();
it2.next();
}
return true;
} var Iterator1 = Iterator([ 10, 20, 30 ]);
var Iterator2 = Iterator([ 10, 20, 30 ]); console.log( compare( Iterator1, Iterator2 ) );

[js高手之路] 设计模式系列课程 - 迭代器(1)的更多相关文章

  1. [js高手之路] 设计模式系列课程 - jQuery的extend插件机制

    这里在之前的文章[js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数基础上增加一个extend浅拷贝,可以为对象方便的扩展属性和方法, jquery的插件扩展机制,大致就是这 ...

  2. [js高手之路]设计模式系列课程-发布者,订阅者重构购物车

    发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...

  3. [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

    所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...

  4. [js高手之路] 设计模式系列课程 - DOM迭代器(2)

    如果你对jquery比较熟悉的话,应该用过 eq, first, last, get, prev, next, siblings等过滤器和方法.本文,我们就用迭代设计模式来封装实现,类似的功能 < ...

  5. [js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数

    一.我们从一个简单的构造函数+原型程序开始 var G = function(){}; G.prototype = { length : 5, size : function(){ return th ...

  6. [js高手之路]设计模式系列课程-单例模式实现模态框

    什么是单例呢? 单,就是一个的意思.例:就是实例化出来的对象,那合在一起就是保证一个构造函数只能new出一个实例,为什么要学习单例模式呢?或者说单例模式有哪些常见的应用场景.它的使用还是很广泛,比如: ...

  7. [js高手之路]设计模式系列课程-设计一个模块化扩展功能(define)和使用(use)库

    模块化的诞生标志着javascript开发进入工业时代,近几年随着es6, require js( sea js ), node js崛起,特别是es6和node js自带模块加载功能,给大型程序开发 ...

  8. [js高手之路]设计模式系列课程-委托模式实战微博发布功能

    在实际开发中,经常需要为Dom元素绑定事件,如果页面上有4个li元素,点击对应的li,弹出对应的li内容,怎么做呢?是不是很简单? 大多数人的做法都是:获取元素,绑定事件 <ul> < ...

  9. [js高手之路] es6系列教程 - 迭代器与生成器详解

    什么是迭代器? 迭代器是一种特殊对象,这种对象具有以下特点: 1,所有对象都有一个next方法 2,每次调用next方法,都会返回一个对象,该对象包含两个属性,一个是value, 表示下一个将要返回的 ...

随机推荐

  1. install ubuntu16.04

    1.添加分区 添加驱动目录/boot,ext4文件系统 ,给200m够了,图中2G多了,勾选格式化 添加      根目录/ 25G ,ext4文件系统,勾选格式化 添加 家目录 /home ,30G ...

  2. mysql 常用函数总结

    常用处理函数: mysql_connect(server,user,pwd,newlink,clientflag) 连接服务器的函数,成功则返回MySQL标识,失败则返回FALSE mysql_sel ...

  3. 新博客在SEO方面需要注意哪几点?

    无论是什么程序的博客,都应该注意这重要的几点! 第一点:网站目标明确进入主题,有些人对于SEO不是特别熟悉,或者说没有接触过.当你做好一个网站,不管网站内容是什么,首先你都得了解最基本的SEO,比如网 ...

  4. 启动tomcat错误:Address already in use: JVM_Bind:8081

    解决方法: 1.打开任务管理器,关闭掉javaw进程. 2.修改tomcat端口:tomcat/conf/server.xml

  5. Docker 集群环境实现的新方式

    近几年来,Docker 作为一个开源的应用容器引擎,深受广大开发者的欢迎.随着 Docker 生态圈的不断建设,应用领域越来越广.云计算,大数据,移动技术的快速发展,加之企业业务需求的不断变化,紧随技 ...

  6. input标签新增属性

    <input   list='list_t' type="text" name='user' placeholder='请输入姓名' value="" / ...

  7. MySQL(六)之MySQL常用操作符

    前言 在前面的MySQL学习中,我们学习了MySQL的安装,管理以及配置,还有是它的DDL.今天给大家分享一下,MySQL的操作符和它的函数这部分. 千里之行始于足下,做什么事情都要脚踏实地的去做才能 ...

  8. cat、tail、head、tee、grep、wc、sort文件操作和过滤

    详见;http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt103 文件操作和过滤 绝大多数命令行工作是针对文件的.我们会在本节中讨论如何 ...

  9. 汇编指令-MOV与ldr区别(7)

    MOV 1.可以寄存器与寄存器之间传递数据 2.可以常数传递到寄存器中(常数不能超过32位) LDR 1.可以地址与寄存器之间的数据传递 2.也可以常数传递到寄存器中 实例: 1.r1与r2之间传递就 ...

  10. 第1阶段——uboot分析之硬件初始化start_armboot函数(5)

    start_armboot()分析:在start.S初始化后跳转到start_armboot实现第2阶段硬件相关的初始化(烧写擦除flash,网卡驱动,usb驱动,串口驱动,从FLASH读内核,启动内 ...