Set和WeakSet都是数据结构而不是数据类型,他俩很相似,前者要放数组在他的数据结构里,后者要放对象在他的数据结构里。而放的方式,两者又有细微的差距。
Set
首先看看声明,注意要new一个,只要是new,我们typeof一下就可以知道这是个object,也就说明了set是个数据结构不是数据类型
1  | let vm = new Set([1,2,3]);  | 
下面看看打印出来的
1  | console.log(vm);  | 
下面就是关于Set的增删查,这里说一下,Set有一个特性,那就是他去重,当他所包含的数组里有重复的元素,他会自动删掉最后一个重复的,当你查长度时,显示的就是没有重复的长度
先来看看增,回忆一下,在数组操作里,我们增加元素用push,而这里我们用add
1  | vm.add(4);  | 
同样如果我们加了一个重复的。根据去重性,最终也不会有两个一样的元素
1  | vm.add(3);  | 
下面是删,当我们想删一个时就用delete,全都想删就用clear
1  | vm.delete(3);  | 
接着是查,我们用has,有就返回true,没有就返回false
1  | console.log(vm.has(3));//true  | 
再就是讲讲遍历
一种用的是for of
1  | for(let value of vm){  | 
另一种是forEach
1  | vm.forEach(value=>console.log(value));  | 
然后就是访问长度,在数组用的是length,这里我们用size
1  | console.log(vm.size);  | 
WeakSet
我们看一下可以把他拆分成,weak和set,也就是说可以把他理解成弱的set,那么之前说了这个数据结构是用来放对象的,那与set比他弱在哪呢,下面我们来看看
假如我们用同样的方法来声明WeakSet
1  | let vm = new WeakSet({a:1,b:2});  | 
我们会看到他会报错,那这就是他弱的地方,他不能直接把对象放进去,而是要add进去
1  | let vm = new WeakSet();  | 
再就是注意一下去重这里有点问题
1  | let vm = new WeakSet();  | 
在这个时候他还是会把两个一摸一样的都输出,因为这两个对象的内存不一样的
而下面这种赋值,内存一样,才认为是内容一样,才会去重
1  | let vm = new WeakSet();  |