跳至主要内容

Map and WeakMap

Map 是什麼?

Map 是 JavaScript 中的一個內建物件,允許你使用任何類型的值(包括物件和基本類型)作為 key,並且能夠記住 key 的插入順序

Map 和 Object 的不同

特性MapObject
鍵的類型可以是任何類型必須是字串或符號
插入順序會記住插入順序不一定記住插入順序
是否可迭代是,可直接迭代鍵、值或鍵值對否,需要手動迭代
預設鍵無預設鍵值繼承自 Object.prototype 的鍵
性能在頻繁新增、刪除操作時更高效一般情況下性能較低
方法提供多種便利的方法(setgethas 等)標準的方法較少(例如 Object.keysObject.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 不能被迭代,也沒有辦法獲取其大小,因為它的鍵是弱引用,這樣可以避免無法被垃圾回收。

參考資料