gpt4 book ai didi

javascript - WeakMap倒置

转载 作者:行者123 更新时间:2023-11-29 23:41:13 25 4
gpt4 key购买 nike

有没有办法在 Javascript 中创建任何其他弱引用的 WeakMap 以存储键值对,其中 键是字符串/数字,值是对象。

引用必须像这样工作:

const wMap = new WeakRefMap();
const referencer = {child: new WeakRefMap()}
wMap.set('child', temp.child);
wMap.has('child'); // true
delete referencer.child
wMap.has('child'); //false

我创建了一种树结构,用于跟踪仍在当前范围内使用的引用。

我会进行大量合并,递归清理深层嵌套结构对于此用例来说效率非常低。

最佳答案

您可以使用 WeakRef 解决它和 FinalizationRegistry .

这是一个用 TypeScript 编写的示例:

class InvertedWeakMap<K extends string | symbol, V extends object> {
_map = new Map<K, WeakRef<V>>()
_registry: FinalizationRegistry<K>

constructor() {
this._registry = new FinalizationRegistry<K>((key) => {
this._map.delete(key)
})
}

set(key: K, value: V) {
this._map.set(key, new WeakRef(value))
this._registry.register(value, key)
}

get(key: K): V | undefined {
const ref = this._map.get(key)
if (ref) {
return ref.deref()
}
}

has(key: K): boolean {
return this._map.has(key) && this.get(key) !== undefined
}
}

async function main() {
const map = new InvertedWeakMap()
let data = { hello: "world!" } as any
map.set("string!", data)

console.log('---before---')
console.log(map.get("string!"))
console.log(map.has("string!"))

data = null
await new Promise((resolve) => setTimeout(resolve, 0))
global.gc() // call gc manually

console.log('---after---')
console.log(map.get("string!"))
console.log(map.has("string!"))
}

main()

它必须与 --expose-gc 一起运行node.js 环境中的选项。

关于javascript - WeakMap倒置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45199043/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com