// 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,即无法枚举。
听起来很像一个智能缓存
| WeakMap | Map |
|---|---|
| set | set |
| get | get |
| has | has |
| delete | delete |
| @@iterator | |
| clear | |
| keys | |
| values | |
| entries | |
| foreach |
WeakSet
类似地,对象集合,无法枚举
| WeakMap | Map |
|---|---|
| add | add |
| has | has |
| delete | delete |
| @@iterator | |
| clear | |
| values | |
| entries | |
| foreach |
拓展阅读
# ES6 系列之 WeakMap
# WeakMap 和 Map 的区别,WeakMap 原理,为什么能被 GC?
# 如何写出一个惊艳面试官的深拷贝?