JavaScript 红宝书笔记 - 第 7 章. 迭代器与生成器

理解迭代

  • 迭代器模式与可迭代对象

    • 迭代器模式:开发者无需事先知道如何迭代就能实现迭代操作的解决方案。
    • 可迭代对象:类似于数组或集合这样的集合类型的实现了 Iterable 接口的对象。它们包含的元素都是有限的,而且都具有无歧义的遍历顺序。当然不一定是集合对象,也可能是具有类似数组行为的其他数据结构,比如计数循环。
  • 任何实现 Iterable 接口的数据结构都可以被实现 Iterator 接口的结构 “消费” 。

  • Symbol.iterator 属性作为键的默认迭代器即实现了 Iterable 接口。检查它是否存在即可判断有无实现迭代器工厂函数。

  • 接收可迭代对象的原生语言特性如下

    • for-of 循环
    • 数组解构
    • 扩展操作符 Array.from()
    • 创建集合
    • 创建映射
    • Promise.all() 接收由期约组成的可迭代对象
    • Promise.race() 接收由期约组成的可迭代对象
    • yield* 操作符,在生成器中使用
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    let arr = ['foo', 'bar', 'baz'];

    // for-of 循环
    for (let el of arr) {
    console.log(el);
    }

    // 数组解构
    let [a, b, c] = arr;
    console.log(a, b, c); // foo, bar, baz

    // 扩展操作符
    let arr2 = [...arr];
    console.log(arr2); // ['foo', 'bar', 'baz']

    // Array.from()
    let arr3 = Array.from(arr);
    console.log(arr3); // ['foo', 'bar', 'baz']

    // Set 构造函数
    let set = new Set(arr);
    console.log(set); // Set(3) {'foo', 'bar', 'baz'}

    // Map 构造函数
    let pairs = arr.map((x, i) => [x, i]);
    console.log(pairs); // [['foo', 0], ['bar', 1], ['baz', 2]]
    let map = new Map(pairs);
    console.log(map); // Map(3) { 'foo'=>0, 'bar'=>1, 'baz'=>2 }

迭代器协议