Map
和WeakMap
Map
Map
是一個以 key-value 的形式儲存資料,類似物件的資料結構,key 可以是任何型別,而 value 也可以是任何型別。new Map()
來生成實例。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()
來生成實例。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
是一個儲存唯一值的集合,類似陣列,但是不允許重複的值。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 屬性 |
有 | 沒有,因為會受到垃圾回收機制影響 |