ES6语法——Set和Map数据结构

Set的用法

​ 在python语言中,Set实际上是一个新的数据结构名叫集合。正如同数学当中的集合一样,在集合中的所有成员的值都是唯一的,不能有重复。ECMAScript6也仿造了这一点有一个Set数据结构。通常是通过new一个Set类型的对象,然后向里面添加元素。如果有重复他会自动去删除这些相同的元素。

1
2
3
const s = new Set();
[6,8,1,5,6,2,3,4,5].forEach(num =>s.add(num));
console.log(s);

​ Set函数可以接受一个数组,或者是具有Iterable接口的其他数据结构皆可。最为其参数。然后用来初始化这个数据结构。同时在Set中添加值的时候不会进行变量的强制转化,5和”5”不是同一个值。同时NaN在这里被认为和其自生是相等的。但是,两个对象总是被认为是不相等的,比如两个空对象之间是不等的。使用Array.from方法可以将Set数据结构转换为常见的数组类型,这样也就实现了数组去重的功能。

Set数据结构可以有四个遍历成员的方法可供选择,具体就是:

  • keys():返回键名遍历器
  • values():返回键值的遍历器
  • entries():返回键值对的遍历器
  • forEach():利用定义的回调函数进行对成员的遍历。

​ 由于Set没有键值对,所以其实keys()和values()返回的内容完全相等。entries()返回的键值对两个成员也是相等的。

WeakSet的用法

WeakSet和Set类似,也是不重复值的集合,但是它和Set有以下的区别:

  1. WeakSet的成员必须是一个对象,不能是其他类型的值。
  2. WeakSet中的对象都是弱类型的,因此在垃圾回收的时候是不会考虑WeakSet的引用问题。这是因为在垃圾回收的时候,机制是依赖于引用一个计数,从而判断当前这个变量被多少对象引用。如果这个值为0,垃圾回收机制就不会释放这块内存。这时候会存在一个问题,就是在垃圾回收的时候忘记取消对回收变量的引用,从而内存不能被释放,进而导致内存泄露。而WeakSet就不会存在这样的问题。他适合临时存放一组对象,并且存放跟这个对象绑定有关的信息。如果这个对象已经没有其他的引用,就会直接从WeakSet中消失。因此,WeakSet中变量的数量是取决于垃圾回收机制的运行,由于垃圾回收机制是不可预测的,所以ES6中不允许对WeakSet进行遍历。

Map的用法:

在传统的语法中,JS的对象是键值对的集合,但是一般只能是字符串当作键来使用。为了解决这个问题,ES6提供了一个名为Map的数据结构,这里键可以是各种类型的值,包括类。

同时Map中接受数组作为参数,并读取相关的信息,其实任何具有Iterator接口,且成员一双元素出现的数据结构都可以作为Map构造函数的参数。

1
2
3
4
5
6
7
8
const items = [
['name','liming'],
['sex','man']
]
const map = new Map(items);
console.log(map.get('name'))
const m2 = new Map(map)
console.log(map.get('name'))

​ 需要注意的是,只有对同一个对象的引用,Map才会将他们视作为同一个键,否则即使他们的名称一样,但内存地址不同也不能视为是同一个键。下面的这个例子说明了这个问题:

1
2
3
4
5
6
7
8
9
10
const map = new Map()
const k1 = ['aa']
const k2 = ['aa']
map.set(['bb'],123)
console.log(map.get(['bb']))

map.set(k1,123)
console.log(map.get(k1))
map.set(k2,456)
console.log(map.get(k2))

这样也就就觉了同名的问题,只要地址不一样,就视为不同的两个属性。

当然,如果map的键是一个普通的简单值二点时候,只要两个严格相等,依然是视为同一个键。

0%