美文网首页
[ES6] 迭代器和生成器

[ES6] 迭代器和生成器

作者: Darkdreams | 来源:发表于2020-07-20 17:09 被阅读0次

迭代器

背景知识

  1. 什么是迭代

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

  1. 迭代和遍历的区别

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

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

  1. 迭代器

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

  1. 迭代模式

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

  • 迭代器应该具有得到下一个数据的能力
  • 迭代器应该具有判断是否还有后续数据的能力

JS中的迭代器

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

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

含义:

  • next 定义: 用于得到下一个数据
  • 返回的对象:
    • value: 下一个数据的值

可迭代协议
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
  • return 方法: 调用该方法, 可以提前结束生成器函数, 从而提前让整个迭代过程结束.
  • throw 方法: 可以在生成器中产生一个错误

相关文章

网友评论

      本文标题:[ES6] 迭代器和生成器

      本文链接:https://www.haomeiwen.com/subject/shkwbctx.html