什么是迭代器?

  其实就是对一个对象内部进行遍历的方法,比如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);

执行结果如下:

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

自己实现一个each迭代器的更多相关文章

  1. 遍历一个Set的方法只有一个:迭代器(interator)。

    Set-HashSet实现类: 遍历一个Set的方法只有一个:迭代器(interator). HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复. 在O ...

  2. 怎样生成一个顶点迭代器(MItMeshVertex)

    最近修改一个maya中的jlCollisionDeformer工具,该工具有一个明显不足,变形后顶点分布太乱,无法满足生产需求.于是考虑对该变形后的顶点进行平滑处理.既然要做平滑处理就要获取当前点及与 ...

  3. 遍历一个Set的方法只有一个:迭代器(interator)

    Set-HashSet实现类: 遍历一个Set的方法只有一个:迭代器(interator). HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同),而且元素不可重复. 在O ...

  4. Python练习-一个简单易懂的迭代器,了解一下

    今天我们学习了迭代器,其实可以理解为是一个元素容器被遍历的方式,不难理解,看看下面的小例子: # 编辑者:闫龙 #一个简单的迭代器 l = [1,2,3,4,5,6,7]#建立一个列表l ite = ...

  5. 手写一个python迭代器

    分析 我们都知道一个可迭代对象可以通过iter()可以返回一个迭代器. 如果想要一个对象称为可迭代对象,即可以使用for,那么必须实现__iter __()方法. 在一个类的实例对象想要变成迭代器,就 ...

  6. 轻量级“集合”迭代器-Generator

    Generator是PHP 5.5加入的新语言特性.但是,它似乎并没有被很多PHP开发者广泛采用.因此,在我们了解PHP 7对Generator的改进之前,我们先通过一个简单却显而易见的例子来了解下G ...

  7. C#设计模式-迭代器模式

    一. 迭代器(Iterator)模式 迭代器是针对集合对象而生的,对于集合对象而言,必然涉及到集合元素的添加删除操作,同时也肯定支持遍历集合元素的操作,我们此时可以把遍历操作也放在集合对象中,但这样的 ...

  8. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  9. [LeetCode] Peeking Iterator 顶端迭代器

    Given an Iterator class interface with methods: next() and hasNext(), design and implement a Peeking ...

随机推荐

  1. jquery获取焦点和失去焦点事件代码

    input失去焦点和获得焦点 鼠标在搜索框中点击的时候里面的文字就消失了. 我们在做网站的时候经常会用到搜索框的获得焦点和失去焦点的事件,因为懒,每次都去写非常的烦,于是就一劳永逸,遇到类似情况就来调 ...

  2. .NET使用存储过程实现对数据库的增删改查

    一.整体思路 先建立存储过程,再通过.net 调用存储过程,来实现对表的增删改查. 二.新建数据库及存储过程 打开SqlServer2008,新建数据库orm1,及表Student. 数据库和表建立好 ...

  3. Android应用程序启动时发生AndroidRuntime : ClassNotFoundException for Activity class的解决方法

    在android应用程序启动时抛出下面异常导致启动失败:07-09 17:12:35.709: ERROR/AndroidRuntime(3866): Uncaught handler: thread ...

  4. 微服务时代TestOps工程师学习总结

    TestOps很新鲜,也是近期衍生的新型职位.那TestOps主要目的是推动整个研发体系与发布体系更多在质量方面.可以这样理解DevOps是从研发推动配合运维和测试,而TestOps是从测试角度推动研 ...

  5. Hibernate学习笔记(3)---hibernate关联关系映射

    一对一关联 假设有两个持久化类(实体类)User与Address,它们之间存在一对一的关系 1,通过主键关联(个人偏向另外一种) User.hbm.xml文件配置 <id name=" ...

  6. 如何在Spring框架上做开发之Context启动中的“Hook”

    1.概述 有些时候,我们需要在spring启动过程中加入一些自己的逻辑,特别是一些基本框架和spring做整合的时候(例如:mybatis-spring-boot-starter),就需要使用Spri ...

  7. 前端js之JavaScript

    知识预览 一小知识 二 JavaScript的基础 BOM对象 DOM对象 实例练习 js拓展 小知识 核心(ECMAScript) 文档对象模型(DOM) Document object model ...

  8. socke编程

    一 客户端和服务端架构 1 硬件c/s架构 2软甲c/s架构 3 socket与c/s的关系:socket是为了开发c/s的 二 osi七层 三张图片http://www.cnblogs.com/wa ...

  9. Chris Richardson微服务翻译:微服务之事件驱动的数据管理

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理(本文) 微服 ...

  10. ajax跨站请求伪造

    用ajax提交数据到后台: {#<!DOCTYPE html>#} <html lang="en"> <head> <meta chars ...