Javascript 需要弱映射(a、b)——>;C

Javascript 需要弱映射(a、b)——>;C,javascript,memory-leaks,weakmap,Javascript,Memory Leaks,Weakmap,我有一个记忆fn,其中fn由两个输入参考进行记忆: let NewRefCursor = memoized( (deref, swap) => refToHash(deref) + refToHash(swap), // memoizer identity fn (deref, swap) => new RefCursor(deref, swap)); // the function we are memoizing 我需要的行为是NewRefCursor(a,b)

我有一个记忆fn,其中fn由两个输入参考进行记忆:

let NewRefCursor = memoized(
    (deref, swap) => refToHash(deref) + refToHash(swap), // memoizer identity fn
    (deref, swap) => new RefCursor(deref, swap)); // the function we are memoizing
我需要的行为是
NewRefCursor(a,b)==NewRefCursor(a,b)
。当
a
b
被垃圾收集时,光标也应该被垃圾收集

是另一个memorized函数,使用它可以使看到的引用仍然允许被GC调用


NewRefCursor
更难记忆,因为它使用两个参数来确定缓存命中率,因此与
WeakMap
不兼容,因此将防止看到的任何引用被GC'ed。我愿意接受任何方式的欺骗,将私有字段附加到输入对象、概率数据结构。这个漏洞需要解决。到目前为止,我唯一的解决方案是在memoize中添加一个限制缓存大小的参数,并根据每个应用调整该参数。总。

如果创建两级弱映射(将弱映射存储在弱映射上),则无论何时对第一级上的obj进行gced,都会丢失整个第二级(当
a
进行gced时,就会丢失
b
)。如果
b
是gced,那么
a
仍然会有一个弱映射,只有在有另一对(
a
,某物)时才会出现。这不是最好的实施,但我认为它足够:

function BiWeakMap() {
    this._map = new WeakMap();
}

BiWeakMap.prototype.set = function(key1, key2, value) {

    if (!this._map.has(key1)) {
        this._map.set(key1, new WeakMap());
    }

    this._map.get(key1).set(key2, value);

    return this;

};

BiWeakMap.prototype.has = function(key1, key2) {

    return this._map.has(key1) && this._map.get(key1).has(key2);

};

BiWeakMap.prototype.get = function(key1, key2) {

    return this._map.get(key1) && this._map.get(key1).get(key2);

};
这个概念可以扩展到n级解决方案。这解决了您的问题还是我遗漏了什么?

请参阅中的备忘录
它以一种通用的方式解决了这个问题,方法是为对象的所有参数建立一个WeakMap索引。WeakMap索引为对象分配唯一的整数,然后可以通过stringify将其与其他参数组合在一起。

如果创建两级弱映射(将weakmaps存储在weakmaps上),则无论何时对第一级上的obj进行gced,都会丢失整个第二级(当对a进行gced时,会丢失b)。如果b是gced,那么a仍然会有一个弱映射,只有在有另一对(a,某物)时才会出现。这解决了你的问题还是我遗漏了什么?