請說明 Map/Set 和 WeakMap/WeakSet 之間的差別是什麼?
Map
和WeakMap
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 對象會被自動回收
Set
和WeakSet
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 /Set | WeakMap /WeakSet |
---|---|---|
key 的型別 | Map : 任意型別 Set : 任意型別 | WeakMap : 物件或 Symbol 作為 key WeakSet : 物件作為元素 |
記憶體管理機制 | 強引用,手動管理記憶體 | 弱引用,不再被引用時自動回收 |
是否可列舉 | 可以列舉,keys(), values() 等方法 | 不可以列舉,無法迭代或獲取所有鍵或值 |
size 屬性 | 有 | 沒有,因為會受到垃圾回收機制影響 |