跳到主要内容

WeakMap 和 WeakSet

两者的特点

  • 弱引用,防止内存泄露
  • WeakMap 只能用对象作为 key,WeakSet 只能用对象做 value
  • 没有 forEach 和 size,只能用 set/add delete has

WeakMap 用法

// WeakMap 弱引用,没有 forEach 和 size,只能用 set delete has
const wMap = new WeakMap

const a = {}

function fn() {
const obj = {name: 'lzw'}
a.obj = obj // 强引用
wMap.set(obj, 'name info') // 只能用对象作为 key
}

fn()
console.log(a) // obj: {name: 'lzw'}
// 浏览器控制台输入:wMap,结果:WeakMap{}
// 结果有可能不为空,这是因为 gc 垃圾清理不一定是及时的
// 可以在开发者工具->内存-> 垃圾桶图标,点击清理内存垃圾

// 场景使用,
const userInfo = {name: 'lzw.'}
const cityInfo = {city: '长沙'}
// userInfo.city = cityInfo
wMap.set(userInfo, cityInfo) // 建立关系,但两者确独立的,而且不影响彼此的销毁逻辑
console.log(wMap.get(userInfo))

WeakSet 用法

// WeakSet 弱引用,防止内存泄露,只能用对象作为 value
// 没有 forEach 和 size,只能用 add delete has
const wSet = new WeakSet()
const set = new Set()

function fn() {
const obj = {name: 'lzw.'}
// set.add(obj)
wSet.add(obj)
}

fn()

// 浏览器控制台输入:wSet,结果:WeakSet{}
// 结果有可能不为空,这是因为 gc 垃圾清理不一定是及时的
// 可以在开发者工具->内存-> 垃圾桶图标,点击清理内存垃圾