[ES6] 迭代器和生成器
2020-07-20 本文已影响0人
Darkdreams
迭代器
背景知识
- 什么是迭代
从一个数据集合中按照一定的顺序, 不断取出数据的过程
- 迭代和遍历的区别
迭代强调的依次取数据, 并不保证取多少, 也不保证把所有数据取完
遍历强调的是要把整个数据依次全部取出
- 迭代器
对迭代过程中, 在不同的语言中有不同的表现形式, 通常为对象
- 迭代模式
一种设计模式, 用于统一迭代过程, 并规范了迭代器规格
- 迭代器应该具有得到下一个数据的能力
- 迭代器应该具有判断是否还有后续数据的能力
JS中的迭代器
JS 规定, 如果一个对象具有 next 方法, 并且该方法返回一个对象, 该对象的格式如下:
{value: 值, done: 是否迭代完成}
含义:
- next 定义: 用于得到下一个数据
- 返回的对象:
- value: 下一个数据的值
可迭代协议
ES6 规定, 如果一个对象具有知名符号属性 Symbol.iterator
, 并且属性值是一个迭代器创建函数, 则该对象是可迭代的(interable)
for-of 循环
for-of 循环用于遍历可迭代对象, 格式如下
for(const item in interator) {
}
展开运算符与可迭代对象
展开运算符可以作用于可迭代对象, 这样, 就可以轻松的将可迭代对象转换为数组
生成器 ( Generator )
- 什么是生成器
生成器是一个通过构造函数 Generator 创建的对象, 生成器既是一个迭代器, 同时又是一个可迭代对象
- 如何创建生成器?
生成器的创建, 必须使用生成器函数(Generator Function)
- 如何书写一个生成器函数呢?
// 这是一个生成器函数, 该函数一定返回一个生成器
function* method() {
}
- 生成器内部是如何执行的?
生成器函数内部是为了给生成器的每次迭代提供的数据
每次调用生成器的 next 方法, 将导致生成器函数运行到下一个yield关键字位置
yield是一个关键字, 该关键字只能在生成器内部使用, 表达"产生"一个迭代数据的意思
- 有哪些需要注意的细节?
1). 生成器函数可以有返回值, 返回值出现在第一次 done 为 true 时的 value 属性中
function* a() {
yield 1;
console.log("1")
yield 2;
console.log("2")
yield 3;
return 4;
}
var b = a()
b.next() // {value: 1, done: false}
b.next() // {value: 2, done: false}
b.next() // {value: 3, done: false}
b.next() // {value: 4, done: true}
2). 调用生成器的 next 方法时, 可以传递参数, 传递的参数会交给yield表达式的返回值
3). 第一次调用 next 方法, 传参没有任何意义
4). 在生成器函数内部, 可以调用其他生成器函数, 但是要注意加上*号
function* a() {
yield "a";
yield "b";
}
function* b() {
yield* a()
yield 3
yield 4
yield 5
}
let c = b();
- 生成器的其他 API
- return 方法: 调用该方法, 可以提前结束生成器函数, 从而提前让整个迭代过程结束.
- throw 方法: 可以在生成器中产生一个错误