[JavaScript基礎]学習①⑨-- generator

1922 ワード

generatorは複数回の関数を返すことができます

function* foo(x) {
    yield x + 1;
    yield x + 2;
    return x + 3;
}

フィボナッチ数列を挙げる

function fib(max) {
    var
        t,
        a = 0,
        b = 1,
        arr = [0, 1];
    while (arr.length < max) {
        t = a + b;
        a = b;
        b = t;
        arr.push(t);
    }
    return arr;
}

//  :
fib(5); // [0, 1, 1, 2, 3]
fib(10); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
function* fib(max) {
    var
        t,
        a = 0,
        b = 1,
        n = 1;
    while (n < max) {
        yield a;
        t = a + b;
        a = b;
        b = t;
        n ++;
    }
    return a;
}

generatorオブジェクトの呼び出し


第1種
var f = fib(5);
f.next(); // {value: 0, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 1, done: false}
f.next(); // {value: 2, done: false}
f.next(); // {value: 3, done: true}
f.next().value

doneは、このgeneratorが実行済みかどうかを示します.doneがtrueの場合、valueはreturnの戻り値です.

第2種

for (var x of fib(5)) {
    console.log(x); //  0, 1, 1, 2, 3
}

generatorはオブジェクト向けに実現できる機能を実現できます


練習:自増ID

var current_id = 0;

function next_id() {
    current_id ++;
    return current_id;
}
'use strict';
function* next_id() {
  var id = 1;
    while (true) {
        yield id++;
    }
    return true;
}
var g=next_id();
for(var x=1;x<10;x++){
      alert(g.next().value);
}//1 2 3 4 5 6 7 8 9 
//  :
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(' !');
}