深入理解js generator數(shù)據(jù)類型

字號:


    下面小編就為大家?guī)硪黄钊肜斫鈐s generator數(shù)據(jù)類型。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。
    1. 概述
    generator 是ES6引入的新的數(shù)據(jù)類型, 看上去像一個函數(shù),除了使用return返回, yield可以返回多次。
    generator 由function* 定義, (注意*號),
    2. 例子
    函數(shù)無法保存狀態(tài), 有時需要全局變量來保存數(shù)字;
    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 一個無限循環(huán)的迭代器
    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()
    當?shù)Y束時, 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方法 返回給定的參數(shù)值,并結束迭代器
    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()方法, 通過拋出一個異常到迭代器中,來重新獲得迭代器的執(zhí)行;
    返回 帶有 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);
    以上這篇深入理解js generator數(shù)據(jù)類型就是小編分享給大家的全部內容了,希望能給大家一個參考