1 set
1.1 set 存值
-
+
向 Set 加入值的时候,不会发生类型转换,所以
+5
和"5"
是两个不同的值。
+Set 内部判断两个值是否不同,使用的算法叫做“Same-value-zero equality”,它类似于精确相等运算符(
+===
),主要的区别是NaN
等于自身,而精确相等运算符认为NaN
不等于自身。
+1.2 实例属性和方法
+- 实例属性
-
+
- Set.prototype.constructor:构造函数,默认就是Set函数。 +
- Set.prototype.size:返回Set实例的成员总数。 +
+ - 实例方法 | 操作
-
+
- add(value):添加某个值,返回 Set 结构本身。 +
- delete(value):删除某个值,返回一个布尔值,表示删除是否成功。 +
- has(value):返回一个布尔值,表示该值是否为Set的成员。 +
- clear():清除所有成员,没有返回值。 +
+ - 实例方法 | 遍历 + +
Array.from
方法可以将 Set 结构转为数组。
1 | const items = new Set([1, 2, 3, 4, 5]); |
1 | function dedupe(array) { |
1 | // 去除数组的重复成员 |
1.4 遍历操作
-
+
Set
的遍历顺序就是插入顺序。
+- 使用 Set 保存一个回调函数列表,调用时就能保证按照添加顺序调用。 +
- Set 结构的实例默认可遍历,它的默认遍历器生成函数就是它的
values
方法。可以省略values
方法,直接用for...of
循环遍历 Set。
+
1 | let set = new Set(['red', 'green', 'blue']); |
-
+
- 使用 Set 可实现并集(Union)、交集(Intersect)和差集(Difference) +
1 | let a = new Set([1, 2, 3]); |
1.4 WeakSet
-
+
- WeakSet 的成员只能是对象,而不能是其他类型的值。 +
- WeakSet 不可遍历,(即没有
keys()
、values()
和entries()
方法),也没有size
属性。无法清空,即不支持clear
方法。
+ WeakMap
只有四个方法可用:get()
、set()
、has()
、delete()
。
+- WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。只要这些对象在外部消失,它在 WeakSet 里面的引用就会自动消失。 +
- WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存,不考虑该对象还存在于 WeakSet 之中。( WeakMap 弱引用的只是键名,而不是键值。键值依然是正常引用。) +
- 如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。一个典型应用场景是,在网页的 DOM 元素上添加数据,就可以使用
WeakMap
结构。当该 DOM 元素被清除,其所对应的WeakMap
记录就会自动被移除。
+
1 | const foos = new WeakSet() |
-
+
- 上面代码保证了
Foo
的实例方法,只能在Foo
的实例上调用。这里使用 WeakSet 的好处是,foos
对实例的引用,不会被计入内存回收机制,所以删除实例的时候,不用考虑foos
,也不会出现内存泄漏。
+
2 Map
-
+
Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应
+
+任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构(都可以当作
+Map
构造函数的参数。这就是说,Set
和Map
都可以用来生成新的 Map。
+如果对同一个键多次赋值,后面的值将覆盖前面的值。
+
+
1 | const map = new Map(); |
-
+
只有对同一个对象的引用,Map 结构才将其视为同一个键。这一点要非常小心。
++1
2
3
4const map = new Map();
map.set(['a'], 555);
map.get(['a']) // undefined-
+
- 上面代码的
set
和get
方法,表面是针对同一个键,但实际上这是两个值,内存地址是不一样的,因此get
方法无法读取该键,返回undefined
。
+ - Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。这就解决了同名属性碰撞(clash)的问题,我们扩展别人的库的时候,如果使用对象作为键名,就不用担心自己的属性与原作者的属性同名。 +
+- 上面代码的