跳至主要内容

請說明 Map/Set 和 WeakMap/WeakSet 之間的差別是什麼?

MapWeakMap

Map

  • 結構:Map 是一個以 key-value 的形式儲存資料,類似物件的資料結構,key 可以是任何型別,而 value 也可以是任何型別。
  • 使用new Map() 來生成實例。
  • 記憶體管理: keys values 不會受到 Javascript 垃圾回收機制的影響。
  • 使用場景: 當需要儲存 key-value 的資料時,並且希望 key 保留在記憶體中直到手動刪除時。
const map = new Map();
map.set("name", "Ashley");
console.log(map.get("name")); // 'Ashley'
map.delete("name");
console.log(map.size); // 0

WeakMap

  • 結構:WeakMap 的 key 只能是物件和 Symbol,value 可以是任何型別。
  • 記憶體管理:WeakMap 的 key 是弱引用(weak reference),當 key 不再被引用時,WeakMap 會被垃圾回收機制自動回收這個 key-value 對象。
  • 使用new WeakMap() 來生成實例。
  • 使用場景: caching data,適合用於需要暫存物件,當 key 不再被引用時,自動回收資料。
const weakMap = new WeakMap();
let obj = {};
weakMap.set(obj, "value");
console.log(weakMap.get(obj)); // 'value'
obj = null; // 解除對 obj 的引用,該 key-value 對象會被自動回收

SetWeakSet

Set

  • 結構:Set 是一個儲存唯一值的集合,類似陣列,但是不允許重複的值。
  • 記憶體管理:值不會受到 Javascript 垃圾回收機制的影響。
  • 使用場景: 當需要管理唯一值的集合,特別是需要剔除重複值時。
const set = new Set([1, 1, 1, 2, 2, 3, 4, 5]);
console.log(set); // Set { 1, 2, 3, 4, 5 }
set.add(6);
console.log(set.has(6)); // true
set.delete(6);
console.log(set.has(6)); // false
console.log(set.size); // 5

WeakSet

  • 結構:WeakSet 的元素只能是物件,並且是弱引用(weak reference)。
  • 記憶體管理:當存入的物件不再被引用時,會被垃圾回收機制自動清理。
  • 使用new WeakSet() 來生成實例。
const weakSet = new WeakSet();
let obj = { key: "value" };
weakSet.add(obj);
console.log(weakSet.has(obj)); // true
obj = null; // 解除對 obj 的引用,該物件會被垃圾回收

總結

差異Map/SetWeakMap/WeakSet
key 的型別Map: 任意型別 Set: 任意型別WeakMap: 物件或 Symbol 作為 key WeakSet: 物件作為元素
記憶體管理機制強引用,手動管理記憶體弱引用,不再被引用時自動回收
是否可列舉可以列舉,keys(), values() 等方法不可以列舉,無法迭代或獲取所有鍵或值
size 屬性沒有,因為會受到垃圾回收機制影響

參考資料

Map WeakMap Set WeakSet