美文网首页
[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