generator的使用

generator是es6標準引入的新的數據類型,一個generator看上去像一個函數,但是可以多次的返回。

generor有function *定義,並且除了return以外,還可以yield返回多次。

以斐波那數列舉例

0 1 1 2 3 5 8 13 21 34

按照如下的寫法

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

只能返回一個數組來進行操作

而generator可以一次返回一個值,不斷返回多次即可。

function* fib(max){
    var t,a = 0,b = 1, n = 0;
    while(n < max){
        yield a;
        [a,b] = [b,a + b];
        n++;

    }
}
console.log(fib(5));

直接調用時返回generator fib(5)只是創建了對象,但是沒有去執行它

調用generator對象有2種方法,一是不斷的調用generator對象的next()方法。

console.log(f.next());
console.log(f.next());
console.log(f.next());
console.log(f.next());
console.log(f.next());

next方法會執行generator的代碼,然後每次遇到yield x,就返回一個對象{value:x done:true},,然後“暫停”。返回的value就是yield的返回值,done表示這個generator是否已經執行結束了。如果donetrue,則value就是return的返回值。

當執行到done爲true的時候,這個generator對象已經全部執行完畢,就不需要再執行next了

第二個方法是直接用for ... of循環迭代generator對象, ,這種方式不需要我們自己判斷done

for(var x of fib(10)){
    console.log(x);
}

這種情況就可以直接輸出 可以把generator看成是記錄狀態的。有值了就返回。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章