let map = new Map();
map.set('a', 1); // 字符串作为键
map.set({}, 2); // 对象作为键
let weakMap = new WeakMap();
weakMap.set({}, 2); // 只能用对象作为键
// weakMap.set('a', 1); // ❌ 报错:无效键(TypeError: Iterator value a is not an entry object)
✅ 2. 垃圾回收机制(GC)
Map
WeakMap
对象作为键时,不会被自动垃圾回收
如果没有其他引用,键对象会被自动回收
🔍 解释 :WeakMap 中的键是"弱引用",不会阻止垃圾回收机制回收该对象。
js复制代码
let obj = {};
let map = new Map();
let weakMap = new WeakMap();
map.set(obj, 'value');
weakMap.set(obj, 'value');
obj = null;
// Map 中的键值对仍然存在(引用保留)
console.log(map); // 仍包含原对象作为键
// WeakMap 的键值对可能会被回收(无法检测)
✅ 3. 可迭代性
Map
WeakMap
是可迭代的(可使用 forEach、for...of、entries() 等)
不是可迭代的,无法遍历键值对
js复制代码
let map = new Map();
map.set('a', 1);
for (let [key, val] of map) {
console.log(key, val);
}
// WeakMap 不支持迭代:
let weakMap = new WeakMap();
// weakMap.forEach(...) ❌ 错误