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() ❌ 不存在任何遍历方法