Javascript 中 function*和 yield 如何理解?

2021-11-16 14:46:21 +08:00
 Rashomon98

function*和 yield 这两个,到底如何理解呢?工作原理和实际应用又是什么样的?求解答

716 次点击
所在节点    问与答
3 条回复
SoloCompany
2021-11-16 18:46:11 +08:00
es2015 原来已经过去 6 年了
alexkuang
2021-11-17 02:11:19 +08:00
了解一下这几个概念: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 语法糖。
Rashomon98
2021-11-17 10:00:58 +08:00
@alexkuang 多谢!!!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/815777

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX