迭代器和生成器
本文最后更新于:9 个月前
迭代器和生成器
迭代器是什么?
在 javascript 中国呢,迭代器是一个对象。他定义了一个序列,并在终止时可能返回一个返回值。迭代器通过使用一个next()
来实现可迭代协议,对象可以自定义他们自己的迭代行为,比如在一个 for..of 中哪些值可以被便利到,在现有的类型中 array、Map、WeakMap 和 String 都有默认的迭代行为,是一个内置可迭代对象。但是 Object 就不行,他不是可迭代对的。要可迭代,那么他必须实现一个@@iterator
方法(一个无参数的函数,其返回值为一个符合迭代器协议的对象)
当迭代器创建之后,就可以通过重读的调用 next()来显式的迭代,当到结束位置后,next()
返回{done:true}
表示已经迭代完成了,也是消耗完了此次的迭代器,因为迭代一般就执行一次。
function makeIterator(start = 0, end = 100, step = 1) {
let iteratorCount = 0;
return {
next: function () {
if (start < end) {
let res = { value: start, done: false };
start += step;
iteratorCount++;
return res;
} else {
return { value: iteratorCount, done: true };
}
}
};
}
let iterator = makeIterator(0,10,1);
let target = iterator.next();
while(!target.done){
console.log(target.value);
target = iterator.next();
}
生成器?
生成器允许你定义一个包含自有迭代算法的函数, 同时它可以自动维护自己的状态。 生成器函数使用 function*
语法编写。 最初调用时,生成器函数不执行任何代码,而是返回一种称为Generator的迭代器。 通过调用生成器的下一个方法消耗值时,Generator函数将执行,直到遇到yield关键字。
function* makeRangeIterator(start = 0, end = Infinity, step = 1) {
for (let i = start; i < end; i += step) {
yield i;
}
}
var a = makeRangeIterator(1,10,2)
a.next() // {value: 1, done: false}
a.next() // {value: 3, done: false}
a.next() // {value: 5, done: false}
a.next() // {value: 7, done: false}
a.next() // {value: 9, done: false}
a.next() // {value: undefined, done: true}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!