介绍迭代器之前,应该先搞清楚迭代的概念,迭代其实就是重复运行某个代码块直到满足指定条件,迭代的实现方式有递归和循环,还有一个很类似的概念是遍历,遍历实际上就是把一个数据集的数据全部取出看一遍,这就是遍历,这二者的区别需要理解。
那什么是迭代器呢,迭代器实际上就是对迭代过程的封装,通常是一个对象。所以迭代器的过程就是帮我们完成迭代的一个东西。在其他语言里也有迭代器这个东西,这些迭代器都应该满足以下规格:
- 迭代器应该具有得到下一个数据的能力
- 迭代器应该具有判断是否还有后续数据的能力
接下来看 JS 中的迭代器,在 JS 中,如果一个对象具有 next 方法,并且 next 方法的返回值为如下格式的对象,那么这就是一个迭代器。
js
{
value:值,
done:是否迭代完成,
}next 方法很显然,就是用于得到下一个数据的方法,也就是说我们返回的这个对象其实就是下一个数据,这个数据对象有两个属性,分别是 value 和 done,分别表示下一个数据的值和是否迭代完成。如果 done 为 true,表示迭代完成。
这里我们写一个迭代器,用于迭代一个数组
js
const arr = [0,1,2,3,4,5];
const iterator = {
i: 0,
next() {
const value = arr[this.i];
this.i++;
let done = false;
if (this.i > arr.length) {
done = true;
}
return {
value,
done
}
}
}有了这个迭代器之后,我们如果想要迭代整个数组,就直接写这样的代码即可
js
let data = iterator.next();
while(!data.done){
console.log(data.value);
data = iterator.next();
}很显然,当我们要迭代数组的时候,只需要使用 iterator 对象即可。这个 iterator 我们是直接写的,这样不太好,假如我 arr 改一下名,就需要重新修改这个 iterator,一般来说我们会使用一个函数来帮我们创建这个 iterator 对象。
js
//迭代器创建函数
function craateIterator(arr){
let i = 0;
return {
next() {
const value = arr[i];
i++;
let done = false;
if (i > arr.length) {
done = true;
}
return {
value,
done
}
}
}
}当我们需要给某个数组创建一个迭代器直接调用,同时,下标 i 可以直接利用闭包放到函数内部。
我们可以使用迭代器来很方便迭代斐波那契数列
js
const iterator = {
dpreviour:0,
previour:0,
next(){
let value;
if(this.previour == 0){
value = 1;
}else{
value = this.dpreviour + this.previour;
}
this.dpreviour = this.previour;
this.previour = value;
return {
value,
done:false,
}
}
}很显然,这里看起来就像是创建了一个无限长的数组,可以一直拿到下一项,这和普通的数据是不同的。