js的ES6语法Set,WeakSet

47 阅读2分钟

Set

基本语法

Set是ES6的新语法,与数组类似,他们最大的区别就是Set用于存储任何类型的唯一值,无论是基本类型还是对象引用。

  • 只能保存值没有键名
  • 严格类型约束,数值1与字符串1属于两个不同的值
  • 值是唯一的
  • 遍历顺序是添加的顺序,方便保存回调函数
let set = new Set([1, "1"]); //初始化数据
set.add(2); //使用 add 添加元素,不允许重复添加值
set.size; //3 获取元素数量
set.has(1); //true 检测元素是否存在
set.delete(1); //true 使用 delete 方法删除单个元素
set.clear();//true   使用 clear 删除所有元素

数组转换

可以使用点语法Array.form 静态方法将Set类型转为数组,这样就可以使用数组处理函数了

const set = new Set([1, 2, 4]);
console.log([...set]); //[1, 2, 4]
console.log(Array.from(set)); //[1, 2, 4]
let sa = [...set].filter((item) => item > 1);
console.log(sa);//[ 2, 4 ]

去除重复

字符串去重

let a = "asdasd";
let b = new Set(a);
console.log(...b);//a s d

数组去重

let arr = [1, 2, 1, 1, 1];
console.log(...new Set(arr)); //1 2

遍历数据

使用 keys()/values()/entries() 都可以返回迭代对象,因为set类型只有值所以 keys与values 方法结果一致。

const hd = new Set(["hdcms", "houdunren"]);
console.log(hd.values()); //SetIterator {"hdcms", "houdunren"}
console.log(hd.keys()); //SetIterator {"hdcms", "houdunren"}
console.log(hd.entries()); //SetIterator {"hdcms" => "hdcms", "houdunren" => "houdunren"}

forof 遍历Set数据,默认使用 values 方法创建迭代器

//使用for/of遍历
let set = new Set([7, 6, 2, 8, 2, 6]);
for (const iterator of set) {
	console.log(iterator);
}

forEach 遍历Set数据,默认使用 values 方法创建迭代器。

let arr = [7, 6, 2, 8, 2, 6];
let set = new Set(arr);
//使用forEach遍历
set.forEach((item,key) => console.log(item,key));

交集-差集-并集

//交集获取两个集合中共同存在的元素
let a = new Set([1, 2]);
let b = new Set([1, 3]);
a = [...a].filter(function (item) {
  return b.has(item);
});
console.log(a);
//差集在集合a中出现但不在集合b中出现元素集合
let c = new Set([1, 2]);
let d = new Set([1, 3]);
c = [...c].filter(function (item) {
  return !d.has(item);
});
console.log(a);
//并集将两个集合合并成一个新的集合
let hd = new Set(['hdcms', 'houdunren']);
let cms = new Set(['后盾人', 'hdcms']);
let newSet = [...hd, ...cms];
console.log(newSet);

WeakSet

和Set相同,只不过它的成员必须只能是对象类型的值。

垃圾回收

内存地址不被引用就会成为垃圾,会被系统的垃圾回收机制清除

image.png

弱引用类型

  • 垃圾回收不考虑WeakSet,即被WeakSet引用时引用计数器不加一,所以对象不被引用时不管WeakSet是否在使用都将删除
  • 因为WeakSet 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行forEach( )遍历等操作
  • 也是因为弱引用,WeakSet 结构没有keys( ),values( ),entries( )等方法和size属性
  • 因为是弱引用所以当外部引用删除时,希望自动删除数据时使用 WeakMap

image.png