在 JavaScript 中,使用地圖資料結構可以將資料與鍵值關聯起來。在 ES6 引入地圖資料結構之前,人們通常將物件用作地圖,將某個物件或值與特定的鍵值關聯起來。
什麼是地圖
地圖資料結構允許將資料與鍵值關聯起來。
ES6 之前
ECMAScript 6(也稱為 ES2015)引入了地圖資料結構到 JavaScript 世界中,以及集合。
在 ES6 之前,人們通常使用物件作為地圖,通過將某個物件或值與特定的鍵值關聯起來:
const car = {}
car['color'] = 'red'
car.owner = 'Flavio'
console.log(car['color']) // red
console.log(car.color) // red
console.log(car.owner) // Flavio
console.log(car['owner']) // Flavio
進入地圖
ES6 引入了地圖資料結構,為我們提供了一個適當的工具來處理這種類型的資料組織。
可以通過調用以下方法來初始化地圖:
const m = new Map()
將項目添加到地圖中
可以使用 set
方法將項目添加到地圖中:
m.set('color', 'red')
m.set('age', 2)
按鍵從地圖中獲取項目
可以使用 get
方法從地圖中獲取項目:
const color = m.get('color')
const age = m.get('age')
按鍵從地圖中刪除項目
使用 delete()
方法:
m.delete('color')
從地圖中刪除所有項目
使用 clear()
方法:
m.clear()
檢查地圖中是否包含特定鍵的項目
使用 has()
方法:
const hasColor = m.has('color')
查找地圖中項目的數量
使用 size
屬性:
const size = m.size
初始化具有值的地圖
可以使用一組值來初始化地圖:
const m = new Map([['color', 'red'], ['owner', 'Flavio'], ['age', 2]])
地圖的鍵
與地圖的鍵-值項目一樣,任何值(物件、陣列、字串、數字)都可以用作鍵,即使是物件也可以。
如果使用 get()
從地圖中取出一個不存在的鍵,它將返回 undefined
。
你幾乎永遠不會在真實生活中遇到的奇怪情況
const m = new Map()
m.set(NaN, 'test')
m.get(NaN) // test
const m = new Map()
m.set(+0, 'test')
m.get(-0) // test
遍歷地圖
遍歷地圖的鍵
地圖提供了 keys()
方法,我們可以使用它來遍歷所有的鍵:
for (const k of m.keys()) {
console.log(k)
}
遍歷地圖的值
地圖對象提供了 values()
方法,我們可以使用它來遍歷所有的值:
for (const v of m.values()) {
console.log(v)
}
遍歷地圖的鍵和值對
地圖對象提供了 entries()
方法,我們可以使用它來遍歷所有的鍵和值對:
for (const [k, v] of m.entries()) {
console.log(k, v)
}
這可以簡化為:
for (const [k, v] of m) {
console.log(k, v)
}
轉換為陣列
將地圖的鍵轉換為陣列
const a = [...m.keys()]
將地圖的值轉換為陣列
const a = [...m.values()]
WeakMap
WeakMap 是特殊類型的地圖。
在地圖對象中,項目永遠不會被回收。但是 WeakMap 允許其所有項目自由地被垃圾回收。WeakMap 的每個鍵都是一個物件。當該物件的引用丟失時,對應的值將被垃圾回收。
以下是主要的區別:
- 不能遍歷一個 WeakMap 的鍵或值(或鍵-值)
- 不能從 WeakMap 中清除所有項目
- 不能檢查其大小
WeakMap 提供了以下方法,它們與地圖的方法等效:
get(k)
set(k, v)
has(k)
delete(k)
使用 WeakMap 的用例不如使用 Map 的用例明確,你可能永遠不會需要使用 WeakMap,但它可以用於構建一個對垃圾回收不會產生干擾的內存敏感型緩存,或用於保密和信息隱藏。