JavaScript提供了四种数据集合,分别是array、object、map和set。
这四种数据集合的数据结构各不相同,但是都可以被循环遍历,这一切的背后都离不开iteration(迭代器)的支撑。
遍历器(Iterator)是一种机制,也可以说是一种接口,它为各种不同的数据结构提供了统一的访问机制。
//迭代器
let arr = [1, 2, 3, 4]
const fn = arr[Symbol.iterator]();
fn.next();
fn.next()
任何数据结构只要配置了 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有成员)
当我们使用for…of循环遍历数组数据结构时,该循环会自动去寻找 Iterator 接口并执行遍历操作。
在js里原生具备 Iterator 接口的数据结构如下:
Array
Map
Set
String
TypedArray
函数的 arguments 对象
NodeList 对象
因此,上面的任意一个数据类型都支持for…of遍历,也可以调用自身的symbol.iteration方法,举个🌰:
let arr = ['a', 'b', 'c'];
//调用原生Symbol.iterator方法,返回一个遍历器对象
let iter = arr[Symbol.iterator]();
//调用遍历器上面的next方法,返回一个代表当前成员的信息对象
iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: 'c', done: false }
iter.next() // { value: undefined, done: true }