Map and WeakMap
Map 是什麼?
Map 是 JavaScript 中的一個內建物件,允許你使用任何類型的值(包括物件和基本類型)作為 key,並且能夠記住 key 的插入順序
Map 和 Object 的不同
| 特性 | Map | Object |
|---|---|---|
| 鍵的類型 | 可以是任何類型 | 必須是字串或符號 |
| 插入順序 | 會記住插入順序 | 不一定記住插入順序 |
| 是否可迭代 | 是,可直接迭代鍵、值或鍵值對 | 否,需要手動迭代 |
| 預設鍵 | 無預設鍵值 | 繼承自 Object.prototype 的鍵 |
| 性能 | 在頻繁新增、刪除操作時更高效 | 一般情況下性能較低 |
| 方法 | 提供多種便利的方法(set、get、has 等) | 標準的方法較少(例如 Object.keys、Object.values) |
| 原型鏈影響 | 不受原型鏈影響 | 可能受原型鏈上的鍵值影響 |
常見操作
建立 Map
const data = [
[1, "one"],
[2, "two"],
];
const map = new Map(data);
新增鍵值對
map.set("name", "John");
map.set(123, "Number Key");
map.set(true, "Boolean Key");
讀取值
console.log(map.get("name")); // John
console.log(map.get(123)); // Number Key
console.log(map.get(true)); // Boolean Key
檢查鍵是否存在
console.log(map.has("name")); // true
console.log(map.has(false)); // false
刪除鍵值對
map.delete("name");
console.log(map.has("name")); // false
獲取 Map 的大小
console.log(map.size); // 2
遍歷 Map
map.forEach((value, key) => {
console.log(key, value);
});
// 或者使用迭代器
for (let [key, value] of map) {
console.log(key, value);
}
Map 轉 Array
// transform map to array
const array = Array.from(map);
console.log(array);
// Or use the keys or values iterators and convert them to an array
const keys = Array.from(map.keys());
console.log(keys); // [ 3, 2, 1 ]
const values = Array.from(map.values());
console.log(values); // [ 'three', 'two', 'one' ]
Map 轉 Object
// transform map to object and doesn't follow the order of map
const obj = Object.fromEntries(map);
console.log(obj);
清空 Map
map.clear();
console.log(map.size); // 0
WeakMap 是什麼?
WeakMap 是一種鍵值對集合,但與 Map 不同的是,它只接受物件作為鍵(而且這些物件是弱引用的)。如果沒有其他變數引用這些物件,它們會被垃圾回收機制自動清理,從而避免內存洩漏。
WeakMap 的特性
- 鍵必須是物件:在 WeakMap 中,鍵只能是物件,而不能是其他基本類型(如字串、數字等)。
- 弱引用:WeakMap 中的鍵是弱引用,這意味著如果沒有其他變數引用這些物件,這些物件會被垃圾回收機制回收。
- 不可迭代:WeakMap 不能被迭代,也沒有辦法獲取其大小,因為它的鍵是弱引用,這樣可以避免無法被垃圾回收。