Set 和 WeakSet
基本知识
- 用于存储任何类型的唯一值,无论是基本类型还是对象引用。
- 只能保存值没有键名
- 严格类型检测如字符串数字不等于数值型数字
- 值是唯一的
- 遍历顺序是添加的顺序,方便保存回调函数
- Set 理解一下就是集合
let mySetA = new set('123456789')
let mySetB = new Set(['后盾人', 'hdcms']);
mySetB.add('houdunren');
mySetB.size;
mySetB.has('hdcms')
mySetB.delete("hdcms")
mySetB.clear();
数组转换
- 可以使用点语法
...
或 Array.form
静态方法将 Set
类型转为数组,这样就可以使用数组处理函数了
const mySetC = new Set(["hdcms", "houdunren"]);
[...mySetC];
Array.from(mySetC);
let AAA = new Set([...new Set("123456789")].filter(item => item < 5));
let BBB = [...new Set("houdunren")].join("");
迭代器
- 使用
keys()/values()/entries()
都可以返回迭代对象,因为 set
类型只有值所以 keys
与 values
方法结果一致。
const mySetD = new Set(["hdcms", "houdunren"]);
mySetD.values();
mySetD.keys();
mySetD.entries();
实现集合
let mySetE = new Set(['hdcms', 'houdunren']);
let mySetF = new Set(['后盾人', 'hdcms']);
let mySetG = new Set(
[...mySetE].filter(item => mySetF.has(item))
);
let mySetH = new Set(
[...mySetE].filter(item => !mySetF.has(item))
);
let mySetJ = [...mySetE, ...mySetF];
WeakSet 基础知识
- WeakSet 结构同样不会存储重复的值,它的成员必须只能是对象类型的值。
- 垃圾回收不考虑
WeakSet
,即被 WeakSet
引用时引用计数器不加一,所以对象不被引用时不管 WeakSet
是否在使用都将删除 - 因为
WeakSet
是弱引用,由于其他地方操作成员可能会不存在,所以不可以进行 forEach()
遍历等操作 - 也是因为弱引用,WeakSet 结构没有
keys(),values(),entries()
等方法和 size
属性 - 因为是弱引用所以当外部引用删除时,希望自动删除数据时使用 WeakMap
const hd = new WeakSet();
const arr = ["hdcms"];
hd.add(arr);
hd.has(arr)
hd.delete(arr);