[ES6] 迭代器和生成器

2020-07-20  本文已影响0人  Darkdreams

迭代器

背景知识

  1. 什么是迭代

从一个数据集合中按照一定的顺序, 不断取出数据的过程

  1. 迭代和遍历的区别

迭代强调的依次取数据, 并不保证取多少, 也不保证把所有数据取完

遍历强调的是要把整个数据依次全部取出

  1. 迭代器

对迭代过程中, 在不同的语言中有不同的表现形式, 通常为对象

  1. 迭代模式

一种设计模式, 用于统一迭代过程, 并规范了迭代器规格

JS中的迭代器

JS 规定, 如果一个对象具有 next 方法, 并且该方法返回一个对象, 该对象的格式如下:

{value: 值, done: 是否迭代完成}

含义:

可迭代协议
ES6 规定, 如果一个对象具有知名符号属性 Symbol.iterator, 并且属性值是一个迭代器创建函数, 则该对象是可迭代的(interable)

for-of 循环

for-of 循环用于遍历可迭代对象, 格式如下

for(const item in interator) {

}

展开运算符与可迭代对象

展开运算符可以作用于可迭代对象, 这样, 就可以轻松的将可迭代对象转换为数组

生成器 ( Generator )

  1. 什么是生成器

生成器是一个通过构造函数 Generator 创建的对象, 生成器既是一个迭代器, 同时又是一个可迭代对象

  1. 如何创建生成器?

生成器的创建, 必须使用生成器函数(Generator Function)

  1. 如何书写一个生成器函数呢?
// 这是一个生成器函数, 该函数一定返回一个生成器
function* method() {

}
  1. 生成器内部是如何执行的?

生成器函数内部是为了给生成器的每次迭代提供的数据

每次调用生成器的 next 方法, 将导致生成器函数运行到下一个yield关键字位置

yield是一个关键字, 该关键字只能在生成器内部使用, 表达"产生"一个迭代数据的意思

  1. 有哪些需要注意的细节?

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();
  1. 生成器的其他 API
上一篇下一篇

猜你喜欢

热点阅读