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
28let 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 }