Skip to content

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 垃圾清理不一定是及时的
// 可以在开发者工具->内存-> 垃圾桶图标,点击清理内存垃圾

基于 MIT 许可发布