Skip to content

介绍迭代器之前,应该先搞清楚迭代的概念,迭代其实就是重复运行某个代码块直到满足指定条件,迭代的实现方式有递归和循环,还有一个很类似的概念是遍历,遍历实际上就是把一个数据集的数据全部取出看一遍,这就是遍历,这二者的区别需要理解。

那什么是迭代器呢,迭代器实际上就是对迭代过程的封装,通常是一个对象。所以迭代器的过程就是帮我们完成迭代的一个东西。在其他语言里也有迭代器这个东西,这些迭代器都应该满足以下规格:

  1. 迭代器应该具有得到下一个数据的能力
  2. 迭代器应该具有判断是否还有后续数据的能力

接下来看 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,
		}
	}
}

很显然,这里看起来就像是创建了一个无限长的数组,可以一直拿到下一项,这和普通的数据是不同的。

以笔记为镜,可以知得失