Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 941f95a

Browse files
✨ feat: 添加迭代器模式
1 parent 98dc20d commit 941f95a

File tree

2 files changed

+156
-0
lines changed

2 files changed

+156
-0
lines changed

‎Iterator/Iterator.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// 创建者类
2+
class Creator {
3+
constructor(list) {
4+
this.list = list;
5+
}
6+
// 创建一个迭代器来进行遍历
7+
creatIterator() {
8+
return new Iterator(this);
9+
}
10+
}
11+
12+
// 迭代器类
13+
class Iterator {
14+
constructor(creator) {
15+
this.list = creator.list;
16+
this.index = 0;
17+
}
18+
19+
// 判断是否完成遍历
20+
isDone() {
21+
if (this.index >= this.list.length) {
22+
return true
23+
}
24+
return false
25+
}
26+
// 向后遍历操作
27+
next() {
28+
return this.list[this.index++]
29+
}
30+
}
31+
32+
let arr = [1,2,3,4];
33+
34+
let creator = new Creator(arr);
35+
let iterator = creator.creatIterator();
36+
console.log(iterator.list) // [1,2,3,4]
37+
while (!iterator.isDone()) {
38+
console.log(iterator.next());
39+
}
40+
41+
// 执行结果为 1,2,3,4
42+
43+
let array = [1,2,3];
44+
45+
let iterator = arr[Symbol.iterator]();
46+
47+
console.log(iterator.next()); // {value: 1, done: false}
48+
console.log(iterator.next()); // {value: 2, done: false}
49+
console.log(iterator.next()); // {value: 3, done: false}
50+
console.log(iterator.next()); // {value: undefined, done: true}

‎Iterator/Itrerator.md

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
# 迭代器模式
2+
3+
> 迭代器模式时指模块提供的一种方法去顺序访问一个集合对象中的各个元素,而又不需要暴露该对象的内部表示。迭代器模式也可以把迭代过程从业务逻辑中分离出来,使用迭代器模式后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。
4+
5+
其实我们无形中已经使用了不少迭代器模式的功能,例如 JS 中数组的 `map`, 与 `forEach`已经内置了迭代器。
6+
7+
```
8+
[1,2,3].forEach(function(item, index, arr) {
9+
console.log(item, index, arr);
10+
});
11+
```
12+
13+
同时迭代器分为两种:内部迭代器 与 外部迭代器
14+
15+
- 内部迭代器
16+
17+
> 内部迭代器在调用时非常方便,外界不会去关系其内部的实现。在每次调用时,迭代器的规则就已经制定完毕,如果遇到一些不同样的迭代规则,此时的内部迭代器就不是很清晰
18+
19+
- 外部迭代器
20+
21+
> 外部迭代器会显式地请求迭代下一个元素(`next`方法),外部迭代器虽然增加了调用的复杂度,但是增强了迭代器的灵活性,我们可以手动地控制迭代过程或者顺序。就像`Generator`函数
22+
23+
### 手写实现一个迭代器
24+
25+
我们可以通过代码实现一个简单的迭代器:
26+
27+
```javascript
28+
// 创建者类
29+
class Creator {
30+
constructor(list) {
31+
this.list = list;
32+
}
33+
// 创建一个迭代器来进行遍历
34+
creatIterator() {
35+
return new Iterator(this);
36+
}
37+
}
38+
39+
// 迭代器类
40+
class Iterator {
41+
constructor(creator) {
42+
this.list = creator.list;
43+
this.index = 0;
44+
}
45+
46+
// 判断是否完成遍历
47+
isDone() {
48+
if (this.index >= this.list.length) {
49+
return true
50+
}
51+
return false
52+
}
53+
// 向后遍历操作
54+
next() {
55+
return this.list[this.index++]
56+
}
57+
}
58+
59+
let arr = [1,2,3,4];
60+
61+
let creator = new Creator(arr);
62+
let iterator = creator.creatIterator();
63+
console.log(iterator.list) // [1,2,3,4]
64+
while (!iterator.isDone()) {
65+
console.log(iterator.next());
66+
}
67+
68+
// 执行结果为 1,2,3,4
69+
```
70+
71+
### ES6中的迭代器
72+
73+
JavaScript 中的有序数据集合包括:
74+
75+
- Array
76+
- Map
77+
- Set
78+
- String
79+
- typeArray
80+
- arguments
81+
- NodeList
82+
83+
!! 注意 Object 不属于有序数据集合
84+
85+
以上的有序数据集合都部署`Symbol.iterator`属性,属性值作为一个函数,执行这个函数,返回一个迭代器,迭代器部署`next`方法来按顺序遍历访问子元素
86+
87+
以数组对象为例:
88+
89+
```javascript
90+
let array = [1,2,3];
91+
92+
let iterator = arr[Symbol.iterator]();
93+
94+
console.log(iterator.next()); // {value: 1, done: false}
95+
console.log(iterator.next()); // {value: 2, done: false}
96+
console.log(iterator.next()); // {value: 3, done: false}
97+
console.log(iterator.next()); // {value: undefined, done: true}
98+
```
99+
100+
101+
102+
### 总结
103+
104+
- 同时迭代器分为两种:内部迭代器 与 外部迭代器, 内部迭代器操作方便,外部迭代器可控性强。
105+
- 任何部署了`[Symbol.iterator]`接口的数据都可以使用`for of`循环。
106+
- 迭代器模式使目标对象和迭代器对象分离,符合了开放封闭原则。

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /