什么是迭代器?

  其实就是对一个对象内部进行遍历的方法,比如jquery的each方法,或者原生js的foreach方法。

迭代器的特点

  针对迭代器,这里有几个特点:

   ☑ 访问一个聚合对象的内容而无需暴露它的内部。

   ☑ 为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。

   ☑ 遍历的同时更改迭代器所在的集合结构可能会导致问题。

   简单的说:封装实现,然后迭代器的聚合对象不用关心迭代的过程,从而符合SRP原则。

ps:SRP单一职责原则(Single Responsibility Principle):就一个类而言,应该仅有一个引起它变化的原因。(说实话我也没看懂是什么东西哈哈哈哈)

首先实现一个简单的each方法,代码如下

 function  each(obj, callback) {
var i = 0,
length = obj.length
for(i; i < length; i++) {
callback(obj[i], i);
}
}
var a = [2, 3, 1, 5]; each(a, function (value, index) {
console.log("第" + index + "的值为:"+ value);
})

结果如下图:

可见,基本遍历的功能已经实现,下面进行一下优化,使之支持参数传递,改进代码如下:

 function  each(obj, callback, arg) {
var i = 0,
length = obj.length;
for(i; i < length; i++) {
callback.call(window, obj[i], i, arg);
}
}
var a = [2, 3, 1, 5];
var b = "我是传入的参数"; each(a, function (value, index, b) {
console.log("第" + index + "的值为:"+ value);
console.log(b);
}, b);

执行结果如下:

还有最后一步改进,就是可以通过判断回调返回的是不是false来提前终止循环,从而节省性能,改进代码如下:

 function  each(obj, callback, arg) {
var i = 0,
value,
length = obj.length;
for(i; i < length; i++) {
value = callback.call(window, obj[i], i, arg);
if(value === false) {
break;
}
}
}
var a = [2, 3, 1, 5];
var b = "我是传入的参数"; each(a, function (value, index, b) {
console.log("第" + index + "的值为:"+ value);
console.log(b);
if(index = 3) {
return false;
}
}, b);

执行结果如下:

至此,一个简单的迭代器就完成啦!

最新文章

  1. ThinkPHP实现定时任务
  2. drawRect与setNeedsDisplay简单介绍
  3. CSS:z-index层级在IE中无效
  4. JS基本概念 -- 数据类型(一)
  5. sql 语句 嵌套子查询 执行顺序分析
  6. C#HttpWebResponse请求常见的状态码
  7. Entity Framework 6.1-Code First【转】
  8. iOS上传图片详解
  9. 【R.转载】apply函数族的使用方法
  10. SQL 调用存储过程
  11. Shiro加密
  12. 关于一些基础的Java问题的解答(六)
  13. Java 消除过期的对象引用
  14. 利用 FFmpeg 将 MP4 转成 FLV
  15. 从零起步做到Linux运维经理,你必须管好的23个细节
  16. 【BZOJ2054】疯狂的馒头(并查集,线段树)
  17. .NET ramework 4.0安装失败
  18. ALTERA FPGA Quartus 指定memory综合使用 M4K块
  19. UVA-10816 Travel in Desert (最小瓶颈最短路)
  20. redis连接被拒绝

热门文章

  1. 自己动手写把”锁”之---JMM和volatile
  2. ElasticSearch 学习记录之ES查询添加排序字段和使用missing或existing字段查询
  3. 连接虚拟机mysql无法访问,报错编号1130的解决方法
  4. Webpack 2 视频教程 012 - 理解Webpack 中的 CSS 作用域与 CSS Modules
  5. Linux上安装Redis
  6. Git上传项目到GitHub
  7. css3弹性盒模型flex快速入门与上手(align-content与align-items)
  8. 抽象方法为什么不能被private与static修饰
  9. 轻量级弹出框 lightbox
  10. webapi框架搭建-创建项目(一)