JavaScript-Iterator
# JavaScript-Iterator
遍历器(Iterator)
需要一种统一的接口机制,来处理所有不同的数据结构
Iterator 的作用有三个:
一是为各种数据结构,提供一个统一的、简便的访问接口;
二是使得数据结构的成员能够按某种次序排列;
三是 ES6 创造了一种新的遍历命令for...of
循环,Iterator 接口主要供for...of
消费。
var it = makeIterator(['a', 'b']);
it.next() // { value: "a", done: false }
it.next() // { value: "b", done: false }
it.next() // { value: undefined, done: true }
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{value: undefined, done: true};
}
};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
是一种接口,为各种不同的数据结构提供统一的访问机制任何数据结构只要部署 iterator 接口,就可以完成遍历操作。
笔记
只要有iterator属性,就可以使用for..of 遍历
- 一种新的遍历命令
for..of
循环,lterator
接口主要供 for...of 消费 - 原生具备
iterator
接口的数据(可用 for..of..遍历)Array
Arguments
Set
Map
String
TypedArray
NodeList
工作原理
创建一个指针对象(由
Symbol.iterator
的函数创建),指向当前数据结构的起始位置第一次调用对象的
next
方法(返回的对象有next
方法),指针自动指向数据结构的第一个成员接下来不断调用
next
方法,指针一直往后移动,直到指向最后一个成员每调用
next
方法返回一个包含value
和done
属性的对象注:需要自定义遍历数据的时候,要想到迭代器
// 声明一个数组
const xiyou = ['1','2','3']
let iterator = xiyou[Symbol.iterator]()
// 调用next方法
console.log(iterator.next()) // {value:'1',done:false}
console.log(iterator.next()) // {value:'2',done:false}
console.log(iterator.next()) // {value:'3',done:false}
console.log(iterator.next()) // {value:undefined,done:true}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 自定义遍历数据
需求:使用for..of遍历,每次返回的结果是对象里面的数组成员(不能使用banji.stus.forEach
,因为不符合面向对象思想)
const banji = {
name:"终极一班",
stus:[
'a',
'b',
'c',
'd'
],
[Symbol.iterator](){
// 索引变量
let index = 0;
let _this = this;
return {
next:function(){
if(index < _this.stus.length){
cosnt result = { value: _this.stus[index],done: false }
// 下标自增
index++
// 返回结果
return result
} else {
{ value: undefined,done: true }
}
}
}
}
}
// 遍历对象
for(let v of banji){
console.log(v) // a // b // c // d
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
上次更新: 2024/08/14, 04:14:33