Set集合是一种无重复元素的列表,通常是用来检验给定是值是否在集合中存在。
创建Set集合
- 可以通过new Set来创建Set集合,并调用add()方法添加元素,size可以获取集合中目前的元素数量
- 由以下代码可以,5并没有和 '5' 发生冲突,说明Set集合是不会对元素进行强制类型转换(注意:+0和-0在Set集合里会被认为相同)
let set = new Set();
set.add(5);
set.add('5');
console.log(set.size); //2
console.log(set); //{5,'5'}
Set集合的方法
- add():方法添加元素
- size: 获取集合中目前的元素数量
- has: 检测集合中是否存在某个值 set.has('5'); //true
- delete() :移除Set集合中的某一个元素 set.delete('5');
- clear(): 移除集合中的所有元素
- forEach(): 回调函数接受3个参数,值,键名和集合本身(Set集合的键名和值是一样的,而数组键名是数值索引)
set.forEach(function(value, key, ownerSet) {
console.log(key + ':' + value);
console.log(ownerSet === set);
})
- 将Set集合转化为数组:重复的项(后面出现的)会被Set集合过滤掉
let set = new Set([1,2,3,4,4,5,2]);
let array = [...set];
console.log(array); //[1, 2, 3, 4, 5]
创建WeakSet集合
- 为什么要WeakSet?
因为Set集合会保留对清除对象的引用,造成内存泄漏。
let set = new Set(),
key = '5';
set.add(key);
key = null;
set.delete(key);
console.log(set); //{'5'}依旧保持对原来对象的引用,没有被清除
WeakSet集合的方法
- 支持3种方法,且和Set集合类似:add(),has(),delete()
let set = new WeakSet();
let key = {};
set.add(key);
console.log(set.has(key));
set.delete(key);
console.log(set);
WeakSet与Set的不同之处
- 只保存对象值得弱引用,就是只有该对象对其引用了,而没有别的对其引用(就不会被标记),就会被垃圾回收机制回收
- add()方法传入非对象参数会导致程序报错,而has()和delete()方法传入非对象参数会返回false。
- 不可被迭代,不能使用for-of,也不支持forEach
- 不支持size属性