如何利用函数实现迭代器
迭代器是一种可以遍历集合类型的对象,通常由一个next()方法和一个isDone()方法组成,next()方法用于返回当前的元素值,isDone()方法用于判断是否遍历结束。在JavaScript中,可以利用函数实现迭代器,本文将介绍如何利用函数实现一个简单的迭代器。
1. 函数生成迭代器
在JavaScript中,函数可以返回一个迭代器对象,利用这个对象可以遍历某个集合类型的元素。下面是一个简单的迭代器实现代码:
function Iterator(items) {
this.idx = 0;
this.items = items;
}
Iterator.prototype = {
next: function() {
var item = this.items[this.idx];
this.idx++;
return item;
},
isDone: function() {
return this.idx === this.items.length;
}
};
在这个例子中,我们定义了一个Iterator类,它的构造函数接收一个items参数,表示需要遍历的集合类型。next()方法返回当前元素并将迭代器指针后移,isDone()方法判断是否遍历结束。通过这种方式,我们可以利用函数生成一个迭代器对象。
2. 生成器函数生成迭代器
ES6引入了生成器函数,可以更方便地生成迭代器。生成器函数是指带有*号的函数,函数内部可以使用yield语句暂停函数执行,并返回一个值给调用方,调用方可以使用next()方法再次执行函数,从上次暂停的地方继续执行。下面的代码演示了如何使用生成器函数实现迭代器:
function* iterator(items) {
for (var i = 0; i < items.length; i++) {
yield items[i];
}
}
var iter = iterator([1, 2, 3]);
console.log(iter.next()); // { value: 1, done: false }
console.log(iter.next()); // { value: 2, done: false }
console.log(iter.next()); // { value: 3, done: false }
console.log(iter.next()); // { value: undefined, done: true }
在这个例子中,我们定义了一个生成器函数iterator(),它使用yield语句暂停函数执行并返回元素值,调用方可以使用next()方法再次执行函数并获取元素值。可见,利用生成器函数可以更方便地生成迭代器。
3. Symbol.iterator方法生成迭代器
在ES6中,类可以定义Symbol.iterator方法,可以返回一个迭代器对象。在这种情况下,类的实例可以直接使用for..of循环遍历。下面是一个使用Symbol.iterator方法生成迭代器的例子:
class Iterator {
constructor(items) {
this.idx = 0;
this.items = items;
}
*[Symbol.iterator]() {
while (this.idx < this.items.length) {
yield this.items[this.idx++];
}
}
}
var iter = new Iterator([1, 2, 3]);
for (let item of iter) {
console.log(item);
}
在这个例子中,我们定义了一个Iterator类,并定义了Symbol.iterator方法,该方法返回一个带有yield语句的生成器函数,类的实例可以直接使用for..of循环遍历。
总之,JavaScript中可以利用函数实现迭代器,函数可以返回一个迭代器对象,可以使用yield语句实现生成器函数生成迭代器,也可以使用Symbol.iterator方法生成迭代器。掌握这些方法,可以更方便地遍历集合类型的对象。
