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看成是记录状态的。有值了就返回。