Set的用法
在python语言中,Set实际上是一个新的数据结构名叫集合。正如同数学当中的集合一样,在集合中的所有成员的值都是唯一的,不能有重复。ECMAScript6也仿造了这一点有一个Set数据结构。通常是通过new一个Set类型的对象,然后向里面添加元素。如果有重复他会自动去删除这些相同的元素。
1 | const s = new Set(); |
Set函数可以接受一个数组,或者是具有Iterable接口的其他数据结构皆可。最为其参数。然后用来初始化这个数据结构。同时在Set中添加值的时候不会进行变量的强制转化,5和”5”不是同一个值。同时NaN在这里被认为和其自生是相等的。但是,两个对象总是被认为是不相等的,比如两个空对象之间是不等的。使用Array.from方法可以将Set数据结构转换为常见的数组类型,这样也就实现了数组去重的功能。
Set数据结构可以有四个遍历成员的方法可供选择,具体就是:
- keys():返回键名遍历器
- values():返回键值的遍历器
- entries():返回键值对的遍历器
- forEach():利用定义的回调函数进行对成员的遍历。
由于Set没有键值对,所以其实keys()和values()返回的内容完全相等。entries()返回的键值对两个成员也是相等的。
WeakSet的用法
WeakSet和Set类似,也是不重复值的集合,但是它和Set有以下的区别:
- WeakSet的成员必须是一个对象,不能是其他类型的值。
- WeakSet中的对象都是弱类型的,因此在垃圾回收的时候是不会考虑WeakSet的引用问题。这是因为在垃圾回收的时候,机制是依赖于引用一个计数,从而判断当前这个变量被多少对象引用。如果这个值为0,垃圾回收机制就不会释放这块内存。这时候会存在一个问题,就是在垃圾回收的时候忘记取消对回收变量的引用,从而内存不能被释放,进而导致内存泄露。而WeakSet就不会存在这样的问题。他适合临时存放一组对象,并且存放跟这个对象绑定有关的信息。如果这个对象已经没有其他的引用,就会直接从WeakSet中消失。因此,WeakSet中变量的数量是取决于垃圾回收机制的运行,由于垃圾回收机制是不可预测的,所以ES6中不允许对WeakSet进行遍历。
Map的用法:
在传统的语法中,JS的对象是键值对的集合,但是一般只能是字符串当作键来使用。为了解决这个问题,ES6提供了一个名为Map的数据结构,这里键可以是各种类型的值,包括类。
同时Map中接受数组作为参数,并读取相关的信息,其实任何具有Iterator接口,且成员一双元素出现的数据结构都可以作为Map构造函数的参数。
1 | const items = [ |
需要注意的是,只有对同一个对象的引用,Map才会将他们视作为同一个键,否则即使他们的名称一样,但内存地址不同也不能视为是同一个键。下面的这个例子说明了这个问题:
1 | const map = new Map() |
这样也就就觉了同名的问题,只要地址不一样,就视为不同的两个属性。
当然,如果map的键是一个普通的简单值二点时候,只要两个严格相等,依然是视为同一个键。