Set和WeakSet

Set和WeakSet都是数据结构而不是数据类型,他俩很相似,前者要放数组在他的数据结构里,后者要放对象在他的数据结构里。而放的方式,两者又有细微的差距。


Set

首先看看声明,注意要new一个,只要是new,我们typeof一下就可以知道这是个object,也就说明了set是个数据结构不是数据类型

1
let vm = new Set([1,2,3]);

下面看看打印出来的

1
2
console.log(vm);
//Set(3) {1, 2, 3}

下面就是关于Set的增删查,这里说一下,Set有一个特性,那就是他去重,当他所包含的数组里有重复的元素,他会自动删掉最后一个重复的,当你查长度时,显示的就是没有重复的长度

先来看看增,回忆一下,在数组操作里,我们增加元素用push,而这里我们用add

1
2
vm.add(4);
console.log(vm);//Set(4) {1, 2, 3, 4}

同样如果我们加了一个重复的。根据去重性,最终也不会有两个一样的元素

1
2
vm.add(3);
console.log(vm);//Set(3) {1, 2, 3}

下面是删,当我们想删一个时就用delete,全都想删就用clear

1
2
3
4
vm.delete(3);
console.log(vm);//Set(2) {1, 2}
vm.clear();
console.log(vm);//Set(0) {}

接着是查,我们用has,有就返回true,没有就返回false

1
console.log(vm.has(3));//true

再就是讲讲遍历

一种用的是for of

1
2
3
for(let value of vm){
console.log(value);
}

另一种是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
2
3
4
5
6
7
let vm = new WeakSet();
let obj = {
a:1,
b:2
}
vm.add(obj);
console.log(vm);

再就是注意一下去重这里有点问题

1
2
3
4
5
6
7
8
9
10
11
12
let vm = new WeakSet();
let obj = {
a:1,
b:2
}
let obj1 = {
a:1,
b:2
}
vm.add(obj);
vm.add(obj1);
console.log(vm);

在这个时候他还是会把两个一摸一样的都输出,因为这两个对象的内存不一样的

而下面这种赋值,内存一样,才认为是内容一样,才会去重

1
2
3
4
5
6
7
8
9
let vm = new WeakSet();
let obj = {
a:1,
b:2
}
let obj1 = obj;
vm.add(obj);
vm.add(obj1);
console.log(vm);
-------------本文结束感谢您的阅读-------------