十四.Generator生成器
1.生成器函数,迭代协议
支持生成器,包含生成器函数的迭代器的特殊情况,其中控制流可以暂停和恢复,以便生成值序列(有限或无限)。
ECMAScript 6
let fibonacci = {
*[Symbol.iterrator]() {
let pre = 0, cur = 1
for (;;) {
[ pre, cur ] = [ cur, pre + cur]
yeild cur
}
}
}
for (let n of fibonacci) {
if (n > 1000)
break
console.log(n)
}
ECMAScript 5
var fibonacci = {
next: (function () {
var pre = 0, cur = 1;
return function () {
tmp = pre;
pre = cur;
cur += tmp;
return cur;
};
})()
};
var n;
for (;;) {
n = fibonacci.next();
if (n > 1000)
break;
console.log(n);
}
2.直接使用生成器函数
支持生成器函数,这是一种特殊的函数变体,可以暂停和恢复控制流,以生成值序列(有限或无限)。
ECMAScript 6
function* range (start, end, step) {
while (start < end) {
yield start
start += step
}
}
for (let i of range(0, 10, 2)) {
console.log(i)
}
ECMAScript 5
function range (start, end, step) {
var list = [];
while (start < end) {
list.push(start);
start += step;
}
return list;
}
var r = range(0, 10, 2);
for (var i = 0; i < r.length; i++) {
console.log(r[i]);
}
3.生成器匹配
支持生成器功能,即可以暂停和恢复控制流的功能,以便产生和扩展值序列(有限或无限)。
ECMAScript 6
let fibonacci = function* (numbers) {
let pre = 0, cur = 1
while (numbers-- >0) {
[ pre, cur ] = [ cur, pre + cur ]
yield cur
}
}
for (let n of fibonacci(1000))
console.log(n)
let numbers = [ ...fibonacci(1000) ]
let [ n1, n2, n3, ...others ] = fibonacci(1000)
ECMAScript 5
//ES5中没有相关表达