了解一下这几个概念:iterable / iterator / generator
具体可以读一下阮一峰的书,18-21 章:
https://wangdoc.com/es6/如果觉得难以理解的话,建议通过学习 python 中的 iterator 和 generator 的概念来触类旁通( py 也有 yield 关键词),我觉得噪音会比 js 少一些。
=== 以下先简单回答一下吧,个人拙见有错误欢迎指正 ===
es6 提供了一个通用的遍历接口,可以自行写 iterator 。generator 可以当作写 iterator 的语法糖。
特点是懒加载,不像数组:拿 python3 举例,range(n) 这个函数经常用于遍历 0 到 n-1 的数字,但运行时并不会创建一个包含 0 到 n-1 所有数字的数组,而是保存一个内部的状态(遍历到哪了)每次需要下一个数字时就计算一下 下一个数,可以避免资源浪费。
当 n 非常大时,比如 10000 ,用数组要存 10000 个整数,而懒加载只需要存一个整数作为状态(比如现在是 999 ,那我知道下一个要返回 1000 ,并且下一次返回时把状态+1 )。
```python3
r = range(10000) # 这是一个 Iterable
it = iter(r) # iter 通过调用 r.__iter__方法生成了一个 Iterator ,这里也是一个 Generator
next(it) # 0
next(it) # 1
next(it) # 2
# 以此类推,next 通过调用 Iterator 上的__next__方法,不断产生( generate )下一个值
```
js 中的 generator 还可以做到 python 中做不到的,就是在调用 next 的时候向其中传值。可以利用这个特性,把异步代码写成同步的形式,类似后来出现的 async/await 语法糖。