为啥引入Set与Map
在ES6之前,当想使用非数值型索引,就会用非数组对象创建所需的数据结构;
ES5中set集合:123456var set = Object.create(null);set.foo = true;// checking for existenceif (set.foo) { // code to execute}
Map集合:
|
|
用这种方法的确可以模拟Set集合与Map集合,但这种所有对象的属性名必须是字符串类型,必须确保每个键名都是字符串类型且在对象中是唯一的。如:
|
|
对于Map集合中,如果它的属性值是假值,则要求使用布尔值的情况下,会被自动转换成false。当在判断Map结合中是否有某些属性场景会有问题:
|
|
ES6中Set
添加元素
|
|
移除元素
|
|
forEach
需要注意的是回调函数中的前两个参数value与key是一样的;
|
|
转换为数组
在前面的迭代器中有讲到可迭代对象可以展开,同样Set可以:
|
|
Weak Set集合
为啥要引入Weak Set?先看一个例子:
|
|
上面例子将变量key设置null时消除了对初识对象的引用,但是Set集合却保留了这个引用;
有时我们希望当其他所有引用都不再存在时,让Set集合的这些引用随之消失;为了解决这个问题,ES6额外引入了一个类型:Weak Set集合(弱引用Set集合)。
Weak Set集合只存储对象的弱引用,并且不可以存储原始值;集合中的弱引用如果是对象唯一的引用,则会被回收并释放相应内存;
Weak Set支持add has和delete方法;
|
|
Weak Set与Set区别:
- Weak Set实例中,只能含有对象参数;非对象参数会报错
- Weak Set不可迭代;
- Weak Set不暴露任何迭代器
- Weak Set不支持forEach方法
- Weak Set不支持size属性
- 最大区别是Weak Set保存的是对象的弱引用
ES6中Map
支持的方法has delete clear
|
|
Map集合初始化
|
|
Map集合的forEach
|
|
Weak Map
Weak Map与Map的不同之处和Weak Set与Set的不同类似
- Weak Map实例中,只能含有对象参数;非对象参数会报错
- Weak Map不可迭代;
- Weak Map不暴露任何迭代器
- Weak Map不支持forEach方法
- Weak Map不支持size属性,不支持clear
- 最大区别是Weak Map保存的是对象的弱引用