V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Rashomon98
V2EX  ›  问与答

Javascript 中 function*和 yield 如何理解?

  •  
  •   Rashomon98 · 2021-11-16 14:46:21 +08:00 · 737 次点击
    这是一个创建于 1094 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    SoloCompany
        1
    SoloCompany  
       2021-11-16 18:46:11 +08:00 via iPhone
    es2015 原来已经过去 6 年了
    alexkuang
        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 语法糖。
    Rashomon98
        3
    Rashomon98  
    OP
       2021-11-17 10:00:58 +08:00
    @alexkuang 多谢!!!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3593 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:49 · PVG 08:49 · LAX 16:49 · JFK 19:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.