迭代器是什么
迭代器(iterator)是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署iterator接口,就可以完成遍历操作。
ES6创造了一种新的遍历命令
for of
循环,iterator主要供for of
使用。
原生具备了iterator接口的数据结构:
- Array
- Arguments
- Set
- Map
- String
- TypedArray
- NodeList
工作原理
- 创建一个指针对象,指向当前数据结构的起始位置;
- 第一次调用对象的
next
方法,指针自动指向数据结构的第一个成员; - 接下来不断不断调用
next
方法,指针一直往后移,直到指向最后一个成员; - 每次调用
next
方法放回一个包含value
和done
属性的对象;
注意 需要自定义遍历数据的时候,记得享到使用迭代器
let obj = {
name: 'xiaoming',
age: 18,
arr: [1,2,3,4]
}
现在我们需要拿到obj
对象里的arr
数组的数据。
由于Object
并没有内置iterator
,所以我们使用for of
遍历时,控制台报错,现在我们给obj
对象加入iterator
let obj = {
name: 'xiaoming',
age: 18,
arr: [1,2,3,4],
[Symbol.iterator(){
let index = 0;
let _this = this;
return {
next: function(){
if(index < _this.arr.length>) {
const result = {
value: _this.arr[index++],
done: false
};
index++
return result;
} else{
return {
value: undefined,
done: true
}
}
}
}
}]
}
for(value of obj){
console.log(value)
}
// 1,2,3,4
iterator
接口的目的,就是为所有数据结构提供一种统一的访问机制,即for of
循环,那么就需要实现一个统一的,默认的iterator
接口:Symbol.iterator
。
可以理解为: 一个对象只要具有
Symbol,iterator
属性,就可以认为是一个可迭代对象。
Symbol.iterator
属性本身是一个函数,就是当前数据结构默认的遍历器生成函数,执行这个函数,就回返回一个迭代器对象。至于函数名Symbol.iterator
,它是一个表达式,返回Symbol
对象的iterator
属性,这是一个预定义好的、类型为Symbol
的特殊值,所以要放在方括号内。
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}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 chaoyumail@126.com