• 关于 JS 迭代器和生成器


    迭代器(MDN):在JS中,它会定义一个序列,并在终止时可能返回一个返回值(如果value和done一起存在,则它是迭代器的返回值),迭代器通过使用 next() 方法实现迭代协议的任何一个对象。其中,最常见的迭代器是Array迭代器。

    调用 iterator.next() 会返回:{ value: unknown, done: boolean }

    // 一个范围迭代器工具示例
    
    function make_range_iterator(start = 0, end = Number.POSITIVE_INFINITY, step = 1) {
        let next_idx = start;
        let iteration_cnt = 0;
    
        const range_iterator = {
            next() {
              let result;
              if (next_idx <= end) {
                result = {
                  value: next_idx,
                  done: false,
                };
                next_idx += step;
                iteration_cnt += 1;
          
                return result;
              }
          
              return {
                value: iteration_cnt,
                done: true,
              };
            },
        };
    
        return range_iterator;
    }
    
    const it = make_range_iterator(1, 5);
    
    let cur_val = it.next();
    while (!cur_val.done) {
      console.log(cur_val.value); // 1, 2, 3, 4, 5
      cur_val = it.next();
    } 

    生成器(MDN):考虑到自定义迭代器成本是比较高的,且需要显式地维护其内部状态。在需要使用迭代器的场景中,我们可以考虑使用生成器函数去产出一种被称为Generator的迭代器。

    function* make_range_iterator_by_gen(start = 0, end = Number.POSITIVE_INFINITY, step = 1) {
        for (let i = start; i <= end; i += step) yield i;
    }
    
    const g = make_range_iterator_by_gen(1, 5);
    let cur_val = g.next();
    while (!cur_val.done) {
        console.log(cur_val.value); // 1, 2, 3, 4, 5
        cur_val = g.next();
    }
    console.log(cur_val); // { value: undefined, done: true }

    // 补充中...

  • 相关阅读:
    Office办公 如何设置WPS的默认背景大小
    百科知识 已知三角形三条边长,如何求解三角形的面积
    Office 如何添加Adobe Acrobat虚拟PDF打印机
    电脑技巧 如何保存网页为PDF
    JAVA Eclipse打开报错failed to load the jni shared library怎么办
    JAVA Eclipse如何导入已有的项目
    easy UI获取数据,打开毕弹窗
    easyUi 的DataGrid的绑定
    MVC异步分页
    MVC分页
  • 原文地址:https://www.cnblogs.com/fanqshun/p/15603317.html
Copyright © 2020-2023  润新知