WeakMap 和 WeakSet
两者的特点
- 弱引用,防止内存泄露
- WeakMap 只能用对象作为 key,WeakSet 只能用对象做 value
- 没有 forEach 和 size,只能用 set/add delete has
WeakMap 用法
js
// WeakMap 弱引用,没有 forEach 和 size,只能用 set delete has
const wMap = new WeakMap();
const a = {};
function fn() {
const obj = { name: 'lzw' };
a.obj = obj; // 强引用
wMap.set(obj, 'name info'); // 只能用对象作为 key
}
fn();
console.log(a); // obj: {name: 'lzw'}
// 浏览器控制台输入:wMap,结果:WeakMap{}
// 结果有可能不为空,这是因为 gc 垃圾清理不一定是及时的
// 可以在开发者工具->内存-> 垃圾桶图标,点击清理内存垃圾
// 场景使用,
const userInfo = { name: 'lzw.' };
const cityInfo = { city: '长沙' };
// userInfo.city = cityInfo
wMap.set(userInfo, cityInfo); // 建立关系,但两者确独立的,而且不影响彼此的销毁逻辑
console.log(wMap.get(userInfo));
WeakSet 用法
js
// WeakSet 弱引用,防止内存泄露,只能用对象作为 value
// 没有 forEach 和 size,只能用 add delete has
const wSet = new WeakSet();
const set = new Set();
function fn() {
const obj = { name: 'lzw.' };
// set.add(obj)
wSet.add(obj);
}
fn();
// 浏览器控制台输入:wSet,结果:WeakSet{}
// 结果有可能不为空,这是因为 gc 垃圾清理不一定是及时的
// 可以在开发者工具->内存-> 垃圾桶图标,点击清理内存垃圾