function*和 yield 这两个,到底如何理解呢?工作原理和实际应用又是什么样的?求解答
1
SoloCompany 2021-11-16 18:46:11 +08:00 via iPhone
es2015 原来已经过去 6 年了
|
2
alexkuang 2021-11-17 02:11:19 +08:00 1
了解一下这几个概念: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 语法糖。 |
3
Rashomon98 OP @alexkuang 多谢!!!
|