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相同,只不过它的成员必须只能是对象类型的值。
垃圾回收
内存地址不被引用就会成为垃圾,会被系统的垃圾回收机制清除
弱引用类型
- 垃圾回收不考虑WeakSet,即被WeakSet引用时引用计数器不加一,所以对象不被引用时不管WeakSet是否在使用都将删除
- 因为WeakSet 是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行
forEach( )
遍历等操作 - 也是因为弱引用,WeakSet 结构没有keys( ),values( ),entries( )等方法和size属性
- 因为是弱引用所以当外部引用删除时,希望自动删除数据时使用
WeakMap