zoukankan      html  css  js  c++  java
  • 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);

      

  • 相关阅读:
    2014最后一篇英语笔记(新开始)
    记录:CSS特殊性——权值规则
    grunt--自动化打包工具使用
    【移动端】---点透事件
    [前端性能提升]--图片转化为base64
    js--cookie
    1.倒数几秒弹窗关闭
    ES6就是ES2015 的主要内容
    call 与 apply的区别
    34枚金币时间管理法
  • 原文地址:https://www.cnblogs.com/rocky-fang/p/5760915.html
Copyright © 2011-2022 走看看