weakMap

70 阅读1分钟

weakMap

特点:

  • key只能是引用类型
  • 无法被遍历
  • 不会影响垃圾回收

应用:

如果你的key全是引用类型, 且无需遍历, 就可以使用weekMap

Map

特点:

  • key可以是引用类型也可以是基础类型
  • 可以被遍历
  • 会阻止垃圾回收,需要手动清理(weekMap大大的降低了心智负担)

键类型限制

// Map 允许任何类型的键
const map = new Map();
map.set('string', 1);       // ✅ 原始值
map.set({}, 2);             // ✅ 对象

// WeakMap 只允许对象作为键
const weakMap = new WeakMap();
weakMap.set({}, 'valid');   // ✅ 对象
weakMap.set('key', 'value');// ❌ TypeError: Invalid value used as weak map key

垃圾回收

let obj = { id: 1 };

// Map 保持强引用
const map = new Map();
map.set(obj, 'data');
obj = null; // 清除引用
// Map 仍然保留键值对,阻止垃圾回收
console.log(map.size); // 1 (对象仍在内存中)

// WeakMap 使用弱引用
let obj2 = { id: 2 };
const weakMap = new WeakMap();
weakMap.set(obj2, 'data');
obj2 = null; // 清除引用
// 垃圾回收时自动删除条目,无法检测是否被回收

可用方法

const map = new Map();
map.set('key', 'value');
console.log(map.size);       // ✅ 1
map.forEach((v, k) => {});   // ✅ 可迭代

const weakMap = new WeakMap();
const key = {};
weakMap.set(key, 'value');
console.log(weakMap.size);   // ❌ undefined
// weakMap.forEach() ❌ 不存在任何遍历方法