ES6 WeakMap
WeakMap 就是 Map ,weak 表示弱映射,
key(弱弱地拿着)而且必须是对象,
意思是 key 不是正式引用,不会阻止垃圾回收,
但只要 key 存在就不会被垃圾回收机制销毁。
只有四个方法:
set(key , value)
|
添加成员并返回WeakMap本身
|
get(key)
|
通过 键 获取 值
|
has(key)
|
通过 键 判断 成员 是否存在
|
delete(key)
|
通过 键 移除 成员
|
const obj1 = { name: "tom" }; const wm = new WeakMap(); const wm1 = wm.set(obj1, false); // 添加成员并返回WeakMap本身 console.log(wm, wm1); console.log(wm.get(obj1)); // 通过 键 获取 值 console.log(wm.has(obj1)); // 通过 键 判断 成员 是否存在 wm.delete(obj1) // 通过 键 移除 成员 console.log(wm);
获取对象必须要用原来的对象
const obj1 = { name: "tom" }; const obj2 = { name: "tom" }; const wm = new WeakMap(); wm.set(obj1, true); // obj1、obj2看着一模一样,但在内存里还是两个引用 console.log(wm.get(obj1)); // 能拿到值 console.log(wm.get(obj2)); // 直接undefined
垃圾回收机制依赖引用计数,如果一个值的引用次数不为 0,垃圾回收机制就不会释放这块内存。
实际情况是我们经常用完一个值后忘记取消引用,导致内存无法释放,类似情况一多就引发内存泄漏。
WeakMap、WeakSet 的引用,都不计入垃圾回收机制,所以就不存在这个问题。
WeakMap、WeakSet 适合临时存放一组对象,以及存放跟对象绑定的信息。
如果引用对象消失,WeakMap、WeakSet 内相关对象也会消失
因成员不固定所有 ES6 规定 WeakMap、WeakSet 不可遍历。