feng xiaohan

Set、Map、WeakSet、WeakMap

Set

天然去重,引用类型除外。(详情方法见 JS 的 Set)

let set: Set<number> = new Set([1, 2, 3, 3, 3]);

Map

将值(value)映射到键(key),Map 的 key 可以是引用类型。(详情见 JS 的 Map)

let obj = { name: "张三" };
let map: Map<object, any> = new Map(); // Map的key的类型为object,value的类型为any

map.set(obj, "李四");
map.get(obj);

WeakMap

WeakMap 的key 只能是引用类型,而且 key 是弱引用,不会被计入垃圾回收

let obj: any = { name: "张三" }; // 1 引用类型第一次使用
let anotherObj: any = obj; // 2 第二次引用
let weakmap: WeakMap<object, any> = new WeakMap();
weakmap.set(obj, "李四"); // 2 WeakMap类型是弱引用,不会增加引用次数 @1
obj = null; // -1 释放引用
conosle.log(weakmap.get(obj)); // 李四
anotherObj = null; // -1

console.log(weakmap); // @2
conosle.log(weakmap.get(obj)); // undefind

@1:但是如果之前的引用都被删除了,weakmap.get 也不能获取到引用类型的值了。

@2:在打印 weakmap 时可能会看到里面存有的值(WeakMap {{...} => '李四'}),但是无法通过 get 取出来。这是因为 V8(Chrome 内置的 JavaScript 引擎,用于解释和执行 JavaScript 代码)的垃圾回收机制(GC)是需要一定时间的(最少为 200ms),为了避免这个时间,weakmap 是无法取到 key 的,并且不允许遍历 weakmap。

WeakSet

WeakSet里只能存引用类型,与 WeakMap 类似

let weakset = new WeakSet([obj]);