Iterator
遍历器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制,即for...of
循环,任何数据结构只要部署 Iterator 接口,就可以完成遍历操作
Iterator 的作用:
1>为各种数据结构,提供一个统一的、简便的访问接口
2>使得数据结构的成员能够按某种次序排列
3>Iterator为es6提供的新的遍历命令for .... of ....提供消费
ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator
属性,或者说,一个数据结构只要具有Symbol.iterator
属性,就可以认为是“可遍历的”(iterable),呐~~可以打印Set看出来啦
具备 Iterator 接口的数据结构有这些:
(1)Array (2)Map (3)Set (4)String (5)TypedArray (6)函数的 arguments 对象 (7)NodeList 对象
数组的iterator属性:
let arr = ['a', 'b', 'c'];
let iter = arr[Symbol.iterator]();
iter.next() // { value: 'a', done: false }
iter.next() // { value: 'b', done: false }
iter.next() // { value: 'c', done: false }
iter.next() // { value: undefined, done: true
不具备iterator接口的数据接口,需要手动部署迭代器。
对于类似数组的对象(存在数值键名和length
属性),部署 Iterator 接口,有一个简便方法,就是Symbol.iterator
方法直接引用数组的 Iterator 接口。普通对象引用之后不起作用
NodeList.prototype[Symbol.iterator] = Array.prototype[Symbol.iterator];
// 或者
NodeList.prototype[Symbol.iterator] = [][Symbol.iterator];
[...document.querySelectorAll('div')] // 可以执行了
某个数据结构部署了 Iterator 接口,就可以对它使用扩展运算符,将其转为数组。
let arr = [...iterable];