迭代器
在js中,迭代器是一个对象,它定义一个序列,并在终止时可能附带一个返回值.
迭代器是通过next()方法实现迭代器协议的任何一个对象,该方法返回具有两个属性的对象:
value:迭代序列的下一个值
done:如果已经迭代到序列中的最后一个值,则它为 true。如果 value 和 done 一起出现,则它就是迭代器的返回值。
一旦创建,迭代器对象可以通过重复调用 next() 显式地迭代。迭代一个迭代器被称为消耗了这个迭代器,因为它通常只能执行一次:在产生终值后,对 next() 的额外调用应该继续返回 {done:true}。
例:范围迭代器
- 定义从[start,end),步长step的序列
function makeRangeIterator(start = 0, end = Infinity, step = 1) {
let nextIndex = start;
let iterationCount = 0;
const rangeIterator = {
next() {
let result;
if (nextIndex < end) {
result = { value: nextIndex, done: false };
nextIndex += step;
iterationCount++;
return result;
}
return { value: iterationCount, done: true };
},
};
return rangeIterator;
}
- 使用迭代器
let it = makeRangeIterator(1, 10, 2);
let result = it.next();
while (!result.done) {
console.log(result.value); // 1 3 5 7 9
result = it.next();
}
console.log(`已迭代序列的大小:${result.value}`); // 5
生成迭代器
生成器函数(Generator 函数)提供了一个强大的替代选择:它允许你定义一个非连续执行的函数作为迭代算法。生成器函数使用
function*
语法编写。
function*
是 JavaScript 中用来定义生成器函数(Generator Function)的语法。生成器函数是一种特殊类型的函数,可以暂停执行并在稍后的时间继续执行。它们通过使用 yield 关键字来产生(yield)一个值,并且在产生值后会暂停执行,等待下一次的调用继续执行
function* makeRangeIterator(start = 0, end = Infinity, step = 1) {
let iterationCount = 0;
for (let i = start; i < end; i += step) {
iterationCount++;
yield i;
}
return iterationCount;
}
当生成器函数被调用时,它会返回一个生成器对象,该对象可以通过调用 next() 方法来控制生成器函数的执行。每次调用 next() 方法时,生成器函数会从上一次暂停的地方继续执行,直到遇到下一个 yield 关键字,再次产生一个值并暂停执行。
斐波那契数列
var fibGenerator = function*() {
let pre =0,
cur =1;
yield pre
yield cur
while(true){
yield pre + cur;
[pre,cur] = [cur,pre+cur]
}
};
//使用
const gen = fibGenerator();
gen.next().value; // 0
gen.next().value; // 1