iterator 迭代器
-
概念:iterator是一种接口机制,为各种不同的数据结构提供统一的访问机制
-
作用:
- 为各种数据结构提供一个统一的访问机制
- 使得数据结构的成员能够按某种次序排列
- ES6创造的新的遍历
for...of
和三点运算符就是用的Iterator
接口
-
工作原理
- 创建一个指针对象(遍历器对象),指向数据结构的起始位置
- 第一次调用
next()
方法,指针自动指向数据结构的第一个成员 - 每次调用
next()
方法返回的是一个包含value
和done
的对象:{value:当前成员的值,done:布尔值} - 接着不断的调用
next()
方法,指针会一直往后移动,直到指向最后一个成员
-
原生具备
iterator
接口的数据结构(可用for..of
遍历)Array
arguments
set容器
map容器
String
-
function iteratorUtil() { let index = 0 //取下标用 let that = this //for..of 中的调用者 if (that instanceof Array) { return { //1.iterator创建一个指针对象,指向数据结构的起始位置 next() { //2.第一次调用next()方法 return index < that.length ? //3.返回一个对象{value:当前的成员,done:布尔值} { value: that[index++], done: false } : { value: that[index++], done: true } } //4.然后不断的调用next(),指针往后移动,直到指针指向最后一个成员 } } else { let keys = Object.keys(that) //获取由对象的键构成的数组 let length = keys.length return { next() { return index < length ? { value: that[keys[index++]], done: false } : { value: that[keys[index++]], done: true } } } } } //给Array原型对象添加自己封装的iteratorUtil方法,同样可以for..of遍历数组 Array.prototype[Symbol.iterator] = iteratorUtil let arr = [3, 8, 4, 6, 9] for (let i of arr) { console.log(i); //依次打印 3 8 4 6 9 } let result = iteratorUtil(arr) console.log(result.next()); let obj = { name: 'pink', age: 20 } //给Object原型对象添加自己封装的iteratorUtil方法,让本不能够使用for..of对象也能使用 for..of遍历对象 Object.prototype[Symbol.iterator] = iteratorUtil for (let i of obj) { console.log(i); //依次打印 pink 20 }