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是否已經執行結束了。如果done
爲true
,則value
就是return
的返回值。
當執行到done爲true的時候,這個generator對象已經全部執行完畢,就不需要再執行next了
第二個方法是直接用for ... of
循環迭代generator對象, ,這種方式不需要我們自己判斷done
:
for(var x of fib(10)){
console.log(x);
}
這種情況就可以直接輸出 可以把generator看成是記錄狀態的。有值了就返回。