〖Vue3 源码笔记06〗WeakMap & WeakSet

284 阅读1分钟
// packages\reactivity\src\reactive.ts

// WeakMaps that store {raw <-> observed} pairs.
const rawToReactive = new WeakMap<any, any>()
const reactiveToRaw = new WeakMap<any, any>()
const rawToReadonly = new WeakMap<any, any>()
const readonlyToRaw = new WeakMap<any, any>()

function createReactiveObject(){
  ...
  observed = new Proxy(target, handlers)
  // 双缓存
  toProxy.set(target, observed)
  toRaw.set(observed, target)
  return observed
}

WeakMap

相比Map,WeakMap键只能为对象,且为弱引用,可以被回收,也因此无法确定当前还有多少key,即无法枚举。

听起来很像一个智能缓存

WeakMapMap
setset
getget
hashas
deletedelete
@@iterator
clear
keys
values
entries
foreach

WeakSet

类似地,对象集合,无法枚举

WeakMapMap
addadd
hashas
deletedelete
@@iterator
clear
values
entries
foreach

拓展阅读

# ES6 系列之 WeakMap
# WeakMap 和 Map 的区别,WeakMap 原理,为什么能被 GC?
# 如何写出一个惊艳面试官的深拷贝?