Skip to content

Commit 5e0525b

Browse files
committed
docs(set): 添加遍历顺序的说明
1 parent 96dfa3b commit 5e0525b

File tree

1 file changed

+45
-35
lines changed

1 file changed

+45
-35
lines changed

docs/set-map.md

Lines changed: 45 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -157,11 +157,15 @@ dedupe([1, 1, 2, 3]) // [1, 2, 3]
157157

158158
Set结构的实例有四个遍历方法,可以用于遍历成员。
159159

160-
- `keys()`返回一个键名的遍历器
161-
- `values()`返回一个键值的遍历器
162-
- `entries()`返回一个键值对的遍历器
160+
- `keys()`返回键名的遍历器
161+
- `values()`返回键值的遍历器
162+
- `entries()`返回键值对的遍历器
163163
- `forEach()`:使用回调函数遍历每个成员
164164

165+
需要特别指出的是,`Set`的遍历顺序就是插入顺序。这个特性有时非常有用,比如使用Set保存一个回调函数列表,调用时就能保证按照添加顺序调用。
166+
167+
**(1)`keys()``values()``entries()`**
168+
165169
`key`方法、`value`方法、`entries`方法返回的都是遍历器对象(详见《Iterator对象》一章)。由于Set结构没有键名,只有键值(或者说键名和键值是同一个值),所以`key`方法和`value`方法的行为完全一致。
166170

167171
```javascript
@@ -211,7 +215,23 @@ for (let x of set) {
211215
// blue
212216
```
213217

214-
由于扩展运算符(`...`)内部使用`for...of`循环,所以也可以用于Set结构。
218+
**(2)`forEach()`**
219+
220+
Set结构的实例的`forEach`方法,用于对每个成员执行某种操作,没有返回值。
221+
222+
```javascript
223+
let set = new Set([1, 2, 3]);
224+
set.forEach((value, key) => console.log(value * 2) )
225+
// 2
226+
// 4
227+
// 6
228+
```
229+
230+
上面代码说明,`forEach`方法的参数就是一个处理函数。该函数的参数依次为键值、键名、集合本身(上例省略了该参数)。另外,`forEach`方法还可以有第二个参数,表示绑定的this对象。
231+
232+
**(3)遍历的应用**
233+
234+
扩展运算符(`...`)内部使用`for...of`循环,所以也可以用于Set结构。
215235

216236
```javascript
217237
let set = new Set(['red', 'green', 'blue']);
@@ -239,7 +259,7 @@ set = new Set([...set].filter(x => (x % 2) == 0));
239259
// 返回Set结构:{2, 4}
240260
```
241261

242-
因此使用Set,可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)。
262+
因此使用Set可以很容易地实现并集(Union)、交集(Intersect)和差集(Difference)。
243263

244264
```javascript
245265
let a = new Set([1, 2, 3]);
@@ -258,19 +278,7 @@ let difference = new Set([...a].filter(x => !b.has(x)));
258278
// [1]
259279
```
260280

261-
Set结构的实例的`forEach`方法,用于对每个成员执行某种操作,没有返回值。
262-
263-
```javascript
264-
let set = new Set([1, 2, 3]);
265-
set.forEach((value, key) => console.log(value * 2) )
266-
// 2
267-
// 4
268-
// 6
269-
```
270-
271-
上面代码说明,`forEach`方法的参数就是一个处理函数。该函数的参数依次为键值、键名、集合本身(上例省略了该参数)。另外,`forEach`方法还可以有第二个参数,表示绑定的this对象。
272-
273-
如果想在遍历操作中,同步改变原来的Set结构,目前没有直接的方法,但有两种变通方法。一种是利用原Set结构映射出一个新的结构,然后赋值给原来的Set结构;另一种是利用Array.from方法。
281+
如果想在遍历操作中,同步改变原来的Set结构,目前没有直接的方法,但有两种变通方法。一种是利用原Set结构映射出一个新的结构,然后赋值给原来的Set结构;另一种是利用`Array.from`方法。
274282

275283
```javascript
276284
// 方法一
@@ -398,7 +406,7 @@ data[element] = metadata;
398406
data["[Object HTMLDivElement]"] // metadata
399407
```
400408

401-
上面代码原意是将一个DOM节点作为对象data的键,但是由于对象只接受字符串作为键名,所以element被自动转为字符串`[Object HTMLDivElement]`
409+
上面代码原意是将一个DOM节点作为对象data的键,但是由于对象只接受字符串作为键名,所以`element`被自动转为字符串`[Object HTMLDivElement]`
402410

403411
为了解决这个问题,ES6提供了Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的Hash结构实现。如果你需要“键值对”的数据结构,Map比Object更合适。
404412

@@ -414,18 +422,18 @@ m.delete(o) // true
414422
m.has(o) // false
415423
```
416424

417-
上面代码使用set方法,将对象o当作m的一个键,然后又使用get方法读取这个键,接着使用delete方法删除了这个键
425+
上面代码使用`set`方法,将对象`o`当作m的一个键,然后又使用`get`方法读取这个键,接着使用`delete`方法删除了这个键
418426

419427
作为构造函数,Map也可以接受一个数组作为参数。该数组的成员是一个个表示键值对的数组。
420428

421429
```javascript
422-
var map = new Map([["name", "张三"], ["title", "Author"]]);
430+
var map = new Map([['name', '张三'], ['title', 'Author']]);
423431

424432
map.size // 2
425-
map.has("name") // true
426-
map.get("name") // "张三"
427-
map.has("title") // true
428-
map.get("title") // "Author"
433+
map.has('name') // true
434+
map.get('name') // "张三"
435+
map.has('title') // true
436+
map.get('title') // "Author"
429437
```
430438

431439
上面代码在新建Map实例时,就指定了两个键`name``title`
@@ -434,8 +442,8 @@ Map构造函数接受数组作为参数,实际上执行的是下面的算法
434442

435443
```javascript
436444
var items = [
437-
["name", "张三"],
438-
["title", "Author"]
445+
['name', '张三'],
446+
['title', 'Author']
439447
];
440448
var map = new Map();
441449
items.forEach(([key, value]) => map.set(key, value));
@@ -602,10 +610,12 @@ map.size // 0
602610

603611
Map原生提供三个遍历器生成函数和一个遍历方法。
604612

605-
- keys():返回键名的遍历器。
606-
- values():返回键值的遍历器。
607-
- entries():返回所有成员的遍历器。
608-
- forEach():遍历Map的所有成员。
613+
- `keys()`:返回键名的遍历器。
614+
- `values()`:返回键值的遍历器。
615+
- `entries()`:返回所有成员的遍历器。
616+
- `forEach()`:遍历Map的所有成员。
617+
618+
需要特别注意的是,Map的遍历顺序就是插入顺序。
609619

610620
下面是使用实例。
611621

@@ -651,7 +661,7 @@ map[Symbol.iterator] === map.entries
651661
// true
652662
```
653663

654-
Map结构转为数组结构,比较快速的方法是结合使用扩展运算符(...)。
664+
Map结构转为数组结构,比较快速的方法是结合使用扩展运算符(`...`)。
655665

656666
```javascript
657667
let map = new Map([
@@ -673,7 +683,7 @@ let map = new Map([
673683
// [[1,'one'], [2, 'two'], [3, 'three']]
674684
```
675685

676-
结合数组的map方法、filter方法,可以实现Map的遍历和过滤(Map本身没有map和filter方法)。
686+
结合数组的`map`方法、`filter`方法,可以实现Map的遍历和过滤(Map本身没有`map``filter`方法)。
677687

678688
```javascript
679689
let map0 = new Map()
@@ -692,15 +702,15 @@ let map2 = new Map(
692702
// 产生Map结构 {2 => '_a', 4 => '_b', 6 => '_c'}
693703
```
694704

695-
此外,Map还有一个forEach方法,与数组的forEach方法类似,也可以实现遍历。
705+
此外,Map还有一个`forEach`方法,与数组的`forEach`方法类似,也可以实现遍历。
696706

697707
```javascript
698708
map.forEach(function(value, key, map)) {
699709
console.log("Key: %s, Value: %s", key, value);
700710
};
701711
```
702712
703-
forEach方法还可以接受第二个参数,用来绑定this
713+
`forEach`方法还可以接受第二个参数,用来绑定`this`
704714
705715
```javascript
706716
var reporter = {

0 commit comments

Comments
 (0)