@@ -157,11 +157,15 @@ dedupe([1, 1, 2, 3]) // [1, 2, 3]
157157
158158Set结构的实例有四个遍历方法,可以用于遍历成员。
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
217237let 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
245265let 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;
398406data[" [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
414422m .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
424432map .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
436444var items = [
437- [" name" , " 张三 " ],
438- [" title" , " Author" ]
445+ [' name' , ' 张三 ' ],
446+ [' title' , ' Author' ]
439447];
440448var map = new Map ();
441449items .forEach (([key , value ]) => map .set (key, value));
@@ -602,10 +610,12 @@ map.size // 0
602610
603611Map原生提供三个遍历器生成函数和一个遍历方法。
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
657667let 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
679689let 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
698708map .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
706716var reporter = {
0 commit comments