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(); |