切图崽的自我修养-[ES6] 迭代器Iterator浅析
Iterator
这真是毅种循环
Iterator不是array,也不是set,不是map, 它不是一个实体,而是一种访问机制
,是一个用来访问某个对象的接口规范,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口,就可以完成遍历操作
(即依次处理该数据结构的成员)。
Iterator的遍历某个数据结构过程是这样的(比如对array进行遍历)
创建一个指针对象,指向当前数组的起始位置
。也就是说,遍历器对象本质上,就是一个指针对象第一次调用指针对象的next方法
,可以将指针指向数据结构的第一个成员, 这时候的返回值是{value:array[0], done:false}第二次调用指针对象的next方法
,指针就指向数据结构的第二个成员,这时候的返回值是{value:array[1], done:false}不断调用指针对象的next方法
,直到它指向数据结构的结束位置这时候的返回值是{value:array[array.length-1], done:true}遍历完毕
为数组['a','b']手动写一个iterator接口
var itertaor = makeIterator(['a', 'b']);
iterator.next() // { value: "a", done: false }
iterator.next() // { value: "b", done: false }
iterator.next() // { value: undefined, done: true }
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{value: undefined, done: true};
}
};
}
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{value: undefined, done: true};
}
};
}
等价于:
let iterator =
makeIterator(['a','b'])=
{next:function(){xxxx}}
等价于:
iterator.next()
= nextIndex<array.length
?{value: array[nextIndex++], done: false}
:{value: undefined, done: true};
所以当
var iterator = makeIterator(['a','b'])
执行完,这时候makeIterator函数内部的nextIndex=0
, 但由于makeIterator
给外部变量iterator
返回了一个引用{next:function(){xxx}}
,所以makeIterator函数无法关闭,现在处于内存泄漏状态(函数的执行上下文环境没有关闭啊我摔!),执行完第一个iterator.next()的时候, 由于此时nextIndex=0, nextIndex<array.length成立,返回的是
{value: array[nextIndex++], done: false}
,这一句实际等价于: 返回{value: array[nextIndex], done: false}
然后nextIndex=nextIndex+1
,现在nextIndex=1了执行完第二个iterator.next()的时候, 由于此时nextIndex=1, nextIndex<array.length成立,返回的是
{value: array[nextIndex++], done: false}
,这一句实际等价于: 返回{value: array[nextIndex], done: false}
然后nextIndex=nextIndex+1
,现在nextIndex=2了执行完第三个iterator.next()的时候, 由于此时nextIndex=2, nextIndex<array.length不成立,返回的是
{value: undefined, done: true}
可遍历对象
事实上,我们不需要手动写array/set/map
的Iterator接口了,因为ES6规定它们是可遍历对象
,所以对应的Iterator接口已经被添加到对应的Symbol.iterator
属性上了(所以这三种数据结构才能用keys(for..of)/values(for..of)/entries(for..of)/foreach
这种方法进行遍历),你可以通过如下方式来获取
let arr = ['a', 'b', 'c'];
let arrIterator = `arr[Symbol.iterator]()`
let set = new Set([1,2,3]);
let setIterator = `set[Symbol.iterator]()`
let map = new Map([x,1][y,2]);
let mapIterator = `map[Symbol.iterator]()`
非可遍历对象
对于非可遍历对象,比如{a:1,b:2},ES6并没有规定这种对象键值对为可遍历对象,所以用for..of是不能对它进行遍历的.如果要使一个对象变成可遍历的,需要手动添加Iterator规则接口到它的Symbol.iterator
属性上去,比如
let obj = {
data: [ 'hello', 'world' ],
[Symbol.iterator]() {
const self = this;
let index = 0;
return {
next() {
if (index < self.data.length) {
return {
value: self.data[index++],
done: false
};
} else {
return { value: undefined, done: true };
}
}
};
}
};
对于其他的不可遍历对象(比如类数组对象),你可以手动在Symbol.iterator
属性上部署上手写的Iterator接口(这样你自己可以写遍历规则),也可以让Symbol.iterator
属性直接指向array的Iterator接口(这样就是用的数组的遍历规则)
切图崽的自我修养-[ES6] 迭代器Iterator浅析的更多相关文章
- 《web全栈工程师的自我修养》读书笔记
有幸读了yuguo<web全栈工程师的自我修养>,颇有收获,故在此对读到的内容加以整理,方便指导,同时再回顾一遍书中的内容. 概览 整本书叙述的是作者的成长经历,通过经验的分享,给新人或者 ...
- 程序员的自我修养(2)——计算机网络(转) good
相关文章:程序员的自我修养——操作系统篇 几乎所有的计算机程序,都会牵涉到网络通信.因此,了解计算机基础网络知识,对每一个程序员来说都是异常重要的. 本文在介绍一些基础网络知识的同时,给出了一些高质量 ...
- GIS制图人员的自我修养(2)--制图意识
GIS制图人员的自我修养(2)--制图意识 by 李远祥 上次提及到GIS制图人员的一些制图误区,主要是为GIS制图人员剖析在制图工作中的一些问题.但如何提高制图的自我修养,却是一个非常漫长的过程,这 ...
- GIS制图人员的自我修养(1)--制图误区
GIS制图人员的自我修养 by 李远祥 最近一直坚持写GIS制图的技术专题,并不是为了要介绍有什么好的技术和方法去制图,而是要告诉所有从事这一方向的人员一个铁铮铮的实现--要做好GIS制图,必须加强自 ...
- web性能优化 来自《web全栈工程师的自我修养》
最近在看<web全栈工程师的自我修养>一书,作者是来自腾讯的前端工程师.作者在做招聘前端的时候问应聘者web新能优化有什么了解和经验,应聘者思索后回答“在发布项目之前压缩css和 Java ...
- IT技术管理者的自我修养
1. 前言 本来写<IT技术管理者的自我修养>与<IT技术人员的自我修养>是一开始就有的想法.但发表<IT技术人员的自我修养>后,收到了不少良好的反馈,博客园的编辑 ...
- 东站七雄保C位!论三线楼市网红板块的自我修养
不对!东站板块才是伍家岗的C位.这里有东站七雄! 前些天发了一篇城东C位之路的文章,居然引发了诸葛说房聊天群内大佬的激烈纷争.公说公有理婆说婆有理,一时争的是不可开交,大有约架之势.所以我决定提前写& ...
- Java程序员的自我修养
一.自我修养路线图 如图,这是笔者所走的路.且不论这路走的对不对,这个过程中行业环境会影响到你,大可不必钻牛角尖.附上这张图的目的是为了说,如果你想成为一个优秀的程序员,那么你一定要有规划.当然,别想 ...
- 全栈的自我修养: 001环境搭建 (使用Vue,Spring Boot,Flask,Django 完成Vue前后端分离开发)
全栈的自我修养: 环境搭建 Not all those who wander are lost. 彷徨者并非都迷失方向. Table of Contents @ 目录 前言 环境准备 nodejs v ...
随机推荐
- Could not load file or assembly 'System.Windows.Forms, Version=6.0.2.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
项目升级后提示错误 System.IO.FileNotFoundException: Could not load file or assembly 'System.Windows.Forms, Ve ...
- ibv_free_device_list()函数
void ibv_free_device_list(struct ibv_device **list); 描述 函数用来释放当前可用的RDMA设备数组. 注意 数组一旦释放,指向设备的指针将不能再由i ...
- iptables使用详解(centos7)
安装前 里面有iptables的命令 [root@mcw01 ~]$ rpm -qa|grep iptables iptables-1.4.21-18.0.1.el7.centos.x86_64 [r ...
- 『现学现忘』Docker相关概念 — 3、IaaS、SaaS、PaaS服务模式补充
目录 1.IaaS服务模式 2.PaaS服务模式 (1)何时使用PaaS (2)PaaS的特点 (3)PaaS优势 3.SaaS服务模式 云计算通俗来说就是输入/输出和计算不在一个主机上.计算要用到计 ...
- 浅识 npm 与 cnpm
npm是什么? Node Package(包) Manager(管理器) 的简称. 在 GitHub 还没有兴起的年代,前端是通过网址来共享代码.比如你想使用 jQuery,那么你点击 jQuery ...
- github打开之后下载缓慢或者下载不了问题的解决
我是一点击下载就会显示下载不了,然后按照网上的教程看的修改hosts文件.大家可以先用这个方法,如果还是不行就可以按照以下操作. 1.登录https://gitee.com/(没有账号的先注册).2. ...
- Android 12(S) 图形显示系统 - 初识ANativeWindow/Surface/SurfaceControl(七)
题外话 "行百里者半九十",是说步行一百里路,走过九十里,只能算是走了一半.因为步行越接近目的地,走起来越困难.借指凡事到了接近成功,往往是最吃力.最艰难的时段.劝人做事贵在坚持, ...
- CF1515H口胡
居然一下就做出来了...不知道是不是对的/fad 考虑操作的本质,首先将所有元素插入线段树中. 来依次考虑每一种操作: 区间与 注意到这个操作类似将某些节点的右儿子合并到左儿子上,而一个节点最多被合并 ...
- 腾讯2021LIGHT公益创新挑战赛赛题分析
前些日子老师让我们报名了LIGHT挑战赛,之后又简单的进行了分析,今天我总结复盘一下,一是为了捋一下自己选题的思路,二是以后遇见类似的项目,更容易找到方向或者触类旁通. 赛题介绍 赛题一:安全教育/保 ...
- Prism 框架解读之一系列
名词解释 1.什么是IOC IOC是 Inversion of Control的缩写,多数书籍翻译成"控制反转". IOC 和依赖注入(DI) 所谓依赖注入,就是由IOC容器在运行 ...