Map
和 WeakMap
是兩種數(shù)據(jù)結構,可用于操縱鍵和值之間的關系。
區(qū)別
我們可以對 Map
的鍵和值使用對象或任何基本類型。
但是,WeakMap
僅接受對象。這意味著我們不能將基本類型用作 WeakMap
的鍵。
const attrs = new WeakMap()
attrs.set('color', 'plum') // error
與 Map
不同,WeakMap
不支持對鍵和值進行迭代。無法獲取 WeakMap
的所有鍵或值。此外,也沒有辦法清除 WeakMap
。
最重要的區(qū)別是,WeakMap
不會阻止在沒有對鍵的引用時對鍵進行垃圾收集。
另一方面,Map
無限期地維護對鍵和值的引用。一旦創(chuàng)建了鍵和值,它們將占用內存,即使沒有對它們的引用,也不會被垃圾收集。這可能會導致內存泄漏問題。
考慮下面的一個簡單代碼,我們將一個唯一的 ID 映射到特定的人的信息:
let id = { value: 1 }
const people = new Map()
people.set(id, {
name: 'Foo',
age: 20,
address: 'Bar'
})
// 移除 id
id = null
刪除鍵對象 id
后,它仍然能夠通過映射鍵訪問其引用:
people.keys().next().value // { value: 1 }
由于這種差異,WeakMap
(顧名思義)保存對鍵的弱引用。它解釋了為什么它的鍵不可枚舉,這在前面的區(qū)別中已經提到。
由于 WeakMap
保存對鍵的弱引用,且無法枚舉,因此無法使用 keys()
、values()
、entries()
這些方法。