• js generator数据类型


    1. 概述

       generator 是ES6引入的新的数据类型, 看上去像一个函数,除了使用return返回, yield可以返回多次。

       generator 由function* 定义, (注意*号),

    2. 例子

      函数无法保存状态, 有时需要全局变量来保存数字;

      2.1

    'use strict';
    
    function next_id(){
       var id = 1;
       while(id<100){
          yield id;
          id++;
       }
       return id;
    }
    
    // 测试:
    var
        x,
        pass = true,
        g = next_id();
    for (x = 1; x < 100; x ++) {
        if (g.next().value !== x) {
            pass = false;
            alert('测试失败!');
            break;
        }

    }
    if (pass) { alert('测试通过!'); }

       2.2 一个无限循环的迭代器

    function* idMaker(){
        var index = 0;
        while(true)
            yield index++;
    }
    
    var gen = idMaker(); // "Generator { }"
    
    console.log(gen.next().value); // 0
    console.log(gen.next().value); // 1
    console.log(gen.next().value); // 2

    2.3Generator.prototype.next()

    当迭代结束时, Generator.next().done ===true, 结束之前 ===false

    function* gen() { 
      yield 1;
      yield 2;
      yield 3;
    }
    
    var g = gen(); // "Generator { }"
    g.next();      // "Object { value: 1, done: false }"
    g.next();      // "Object { value: 2, done: false }"
    g.next();      // "Object { value: 3, done: false }"
    g.next();      // "Object { value: undefined, done: true }"

    2.4 Generator.prototype.return();

    return方法 返回给定的参数值,并结束迭代器

    example

    function* gen() { 
      yield 1;
      yield 2;
      yield 3;
    }
    
    var g = gen();
    
    g.next();        // { value: 1, done: false }
    g.return("foo"); // { value: "foo", done: true }
    g.next();        // { value: undefined, done: true }

    注意 如果 done的值是true了, 再调用return,返回的值也是undefined

    function* gen() {yield 1;}
    var g = gen();
    console.log(g.next());//{ value: 1, done: false }
    console.log(g.next());//{ value: undefined, done: true }
    console.log(g.return(1)); //{ value: undefined, done: true }

    2.5 Generator.prototype.throw()

      thorw()方法, 通过抛出一个异常到迭代器中,来重新获得迭代器的执行;

       返回 带有 value和done两个属性的object对象

    function* gen() {
      while(true) {
        try {
           yield 42;
        } catch(e) {
          console.log("Error caught!");
        }
      }
    }
    
    var g = gen();
    var a = g.next();
    // { value: 42, done: false }
    var b = g.throw(new Error("Something went wrong"));
    // "Error caught!"
    // { value: 42, done: false }
    console.log(a);
    console.log(b.value+"::"+b.done);

      

  • 相关阅读:
    c语言输入一个字符串,统计其字母,数字和其他字符的个数,并以柱状图输出
    c语言中的#ifdef和#ifndef
    宏定义#define
    c语言中的register int
    android SDK 更新的几个网址
    android studio启动不进行fetching Android sdk compoment information
    android eclipse ADT 安装maven插件失败
    Jsp 的映射
    Jsp 九大隐式对象
    Jsp 乱码处理
  • 原文地址:https://www.cnblogs.com/rocky-fang/p/5760915.html
Copyright © 2020-2023  润新知