0%

迭代器是什么

概述

迭代的定义:从一个数据集合中按照一定的顺序,不断取出数据的过程称为迭代。

迭代和遍历的区别

迭代:迭代强调的是依次取数据的过程,并不保证取多少,也不保证把所有的数据都取完

遍历:遍历强调的是要把整个数据依次全部取出

迭代器是一种特殊的对象,它具有一些专门为迭代过程设计的接口。所有迭代器都有一个next()方法,每次调用都会返回一个结果对象。结果有两个属性,一个是value,标识下一个将要返回的值;另一个是一个布尔类型,当没有更多可返回数据时返回true。

迭代器还会保存一个内部指针,用来指向当前集合中值的位置,每调用一次next()方法,都会返回下一个可用的值。

如果最后一个值返回后再调用next()方法,那么返回的对象中属性done值为true,属性value则包含迭代器最终返回的值,这个返回值不是数据集的一部分,它与函数的返回值类似,是函数调用过程中最后一次给调用者传递信息的方法,如果没有相关数据则返回undefined。

为什么会出现迭代器

防止for循环遍历的过程中出错导致整个循环终止,此外还有自定义遍历逻辑的场景需要迭代器。

如何实现迭代器

实现迭代器的核心就是给被迭代对象添加一个属性key为Symbol.iterator的方法,该方法返回一个next函数,继续返回一个valuedone,其中value为返回的迭代值,done为当前迭代的状态,为false的时候会继续迭代,直到donetrue

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var obj = {
arr: [1, 2, 3],
}

obj[Symbol.iterator] = function() {
var i = 0;
return {
next: function() {
return {
value: this.arr[i++],
done: i > this.arr.length
}
}.bind(obj)
}
}
console.log(obj)
for (const item of obj) {
console.log(item)
}