ES6迭代器
说起迭代器, 那就要先了解迭代模式
迭代模式: 提供一种方法可以顺序获得聚合对象中的各个元素, 是一种最简单,
也是最常见的设计模式,它可以让用户通过特定的接口寻访集合中的每一个元素
而不用了解底层的实现。
迭代器 : 依照迭代模式的思想而实现,
分为内部迭代器和外部迭代器,
内部迭代器: 本身是函数, 该函数内部定义好迭代规则,完全接手整个迭代过程
外部只需要一次初始调用,如Array.prototype.forEach, Jquery.each
外部迭代器: 本身是函数, 执行返回迭代对象,迭代下一个元素必须显示调用,
调用复杂度增加,但灵活性增强。
我们主要来了解一下外部迭代器:
外部迭代器本身是一个函数, 执行这个函数就相当于启动了这个迭代器,
然后我们每次迭代需要手动调用next()方法,返回一个对象,
基于此我们来自己实现一个外部迭代器
const arr = [2,3,4];
function OuterIterator(o) {
let curIndex = 0;
let next = () => {
return {
value: o[curIndex],
done: o.length === ++curIndex,
}
};
return {
next
}
}
const oIt = OuterIterator(arr);
console.log(oIt.next());
console.log(oIt.next());
console.log(oIt.next());
结果:
我们为什么要用外部迭代器呢 ?
想象一个场景, 后端给前端返回一个数组形式的数据, 前端通过for 循环遍历
当业务变动时, 后端传给前端的不再是数组了, 而是一个对象又
或者是一个Map/Set 结构的数据, 那前端的遍历代码就需要大规模重写。
所以我们要标准化迭代操作,
解决方案: ES6 引入Iterator, 部署在NodeLlist, argument, Array, Set, Map , 字符串
等数据上的Symbol.iterator属性 , 使得这些数据是可迭代的, 并可进行
for...of , ... , Array.from等操作。
这里插播一个内容Symbol: js 第七种 基本数据结构
特点: 唯一, 可作为对象属性, 有静态方法Symbol.iterator
Symbol如果传入的是对象的话,会隐式调用对象的toString() 方法,比如:
let os = Symbol({'name': 'liu'});
console.log(os);
let os2 = Symbol({'name': 'liu', toString() {
return "我最帅"
}});
console.log(os2);
我们重写了对象的toString方法, 结果:
回到主题, 原生有iterator接口的只有NodeLlist, argument, Array, Set, Map , 字符串等数据
对象上是没有iterator的, 所以它不能被迭代, 也不能进行for...of , ... , Array.from等操作
那我们要迭代对象怎么办呢 ?
没错, 就是给它加上我们自己按照ES6规范写外部迭代器:
const obj = {
0: 'liu',
1: '18',
2: 'man',
}; console.log([...obj]);
直接用...操作符报错, obj 不可迭代
const obj = {
0: 'liu',
1: '18',
2: 'man',
length: 4,
[Symbol.iterator] : function () {
let curIndex = 0;
let next = () => {
return {
value: this[curIndex],
done: this.length === ++curIndex,
}
};
return {
next
}
}
};
console.log([...obj]);
结果:
obj必须是类数组, 就是属性是数字 , 且有length属性 才能这样写。
我们下一篇来讨论generator生成器, 它可以生成一个迭代对象。
ES6迭代器的更多相关文章
- ES6 迭代器和生成器
设计为了更高效的数据处理,避免过多for循环嵌套(代码复杂度,跟踪多个循环变量) 1. 迭代器: 为迭代过程设计的接口 所有的迭代器对象都有next()方法,每次调用都返回一个结果对象,对象有两个属性 ...
- ES6 迭代器
Iterator Iterator 是 ES6 引入的一种新的遍历机制,迭代器有两个核心概念: 迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为Symbol.itera ...
- ES6迭代器和生成器
一.迭代器 JavaScript 原有的表示"集合"的数据结构,主要是数组(Array)和对象(Object),ES6 又添加了Map和Set.这样就需要一种统一的接口机制,来处理 ...
- 切图崽的自我修养-[ES6] 迭代器Iterator浅析
Iterator 这真是毅种循环 Iterator不是array,也不是set,不是map, 它不是一个实体,而是一种访问机制,是一个用来访问某个对象的接口规范,为各种不同的数据结构提供统一的访问机制 ...
- ES6中的迭代器(Iterator)和生成器(Generator)
前面的话 用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简 ...
- ES6中的迭代器(Iterator)和生成器(Generator)(一)
用循环语句迭代数据时,必须要初始化一个变量来记录每一次迭代在数据集合中的位置,而在许多编程语言中,已经开始通过程序化的方式用迭代器对象返回迭代过程中集合的每一个元素 迭代器的使用可以极大地简化数据操作 ...
- ES6入门十:iterator迭代器
迭代模式 ES6迭代器标准化接口 迭代循环 自定义迭代器 迭代器消耗 一.迭代模式 迭代模式中,通常有一个包含某种数据集合的对象.该数据可能存在一个复杂数据结构内部,而要提供一种简单的方法能够访问数据 ...
- ES6生成器与迭代器
ES6迭代器的一个例子 function run(taskDef) { var task = taskDef(); var result = task.next(); // 递归执行迭代 functi ...
- 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!【转载+整理】
原文地址 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和for-of循环 生成器 Generators 模板字符串 不定参数和默认参数 解构 Destructu ...
随机推荐
- pip安装指定版本的程序的命令
pip安装指定版本的程序的命令 pip install -i https://pypi.douban.com/simple/ django==1.10.3 或者 pip install django= ...
- 【Spring AOP】通知(五)
一.通知介绍 1. 前置通知(Before) 在目标方法执行之前执行的通知. 前置通知方法,可以没有参数,也可以额外接收一个JoinPoint,Spring会自动将该对象传入,代表当前的连接点,通过该 ...
- NOIP 2003 乒乓球
洛谷 P1042 乒乓球 https://www.luogu.org/problemnew/show/P1042 JDOJ 1363: [NOIP2003]乒乓球 T1 https://neooj.c ...
- jsp中如何使用Ueditor
在jsp页面中类似word编辑器操作textarea 使用步骤: step1.官网下载Ueditor http://ueditor.baidu.com/website/download.html ...
- 【excel】=EXACT(A1,B1) 比较两个字符串是否相等
相等返回true 不相等返回false
- CSS/H5保留显示 textarea输入的空格和换行
.show { white-space: pre-wrap; }
- 11/2 下午 <String>
344. Reverse String 解法一(暴力法): 直接从两头往中间走,同时交换两边的字符即可 首位对调位置. class Solution { public void reverseStri ...
- Express服务器开发
作者 | Jeskson 来源 | 达达前端小酒馆 Express服务器开发 创建Express应用程序,Express路由,pug视图模板的使用 Express简介: 让我们来创建Express应用 ...
- ORACLE--报错,ORA-38770
一,问题描述 背景说明,Dg备库需要恢复到三天前,但是期间没有开闪回,临时开始,出现了这个错误.原因分析: To enable Flashback Database, you configure a ...
- 第20课 unique_ptr独占型智能指针
一. unique_ptr的基本用法 (一)初始化方式 1. 直接初始化:unique<T> myPtr(new T); //ok.但不能通过隐式转换来构造,如unique<T&g ...