Skip to main content

Map

Map

任何具有 Iterator 接口、且每个成员都是一个双元素的数组的数据结构(详见《Iterator》一章)都可以当作 Map 构造函数的参数。这就是说,Set 和 Map 都可以用来生成新的 Map.

const map = new Map([
['name', '张三'],
['title', 'Author'],
])

map.size // 2
map.has('name') // true
map.get('name') // "张三"
map.has('title') // true
map.get('title') // "Author"

const set = new Set([
['foo', 1],
['bar', 2],
])
const m1 = new Map(set)
m1.get('foo') // 1

const m2 = new Map([['baz', 3]])
const m3 = new Map(m2)
m3.get('baz') // 3
  • map 转对象
const map = new Map([
['name', '张三'],
['title', 'Author'],
])

let obj = Object.fromEntries([...map]) //{name: '张三', title: 'Author'}

对象转 map

let obj = { a: 1, b: 2 }
let map = new Map(Object.entries(obj))

WeakMap

WeakMap 的实际目的在于,现在某个对象上面存放一些数据,但是这会形成对于这个对象的引用,

const e1 = document.getElementById('foo')
const e2 = document.getElementById('bar')
const arr = [
[e1, 'foo 元素'],
[e2, 'bar 元素'],
]

基本上,如果你要往对象上添加数据,又不想干扰垃圾回收机制,就可以使用 WeakMap。一个典型应用场景是,在网页的 DOM 元素上添加数据,就可以使用 WeakMap 结构。当该 DOM 元素被清除,其所对应的 WeakMap 记录就会自动被移除。

WeakRef

弱引用对象的一大用处,就是作为缓存,未被清除时可以从缓存取值,一旦清除缓存就自动失效

function makeWeakCached(f) {
const cache = new Map()
return (key) => {
const ref = cache.get(key)
if (ref) {
const cached = ref.deref()
if (cached !== undefined) return cached
}

const fresh = f(key)
cache.set(key, new WeakRef(fresh))
return fresh
}
}

const getImageCached = makeWeakCached(getImage)