首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要WeakMap (a,b) -> c

需要WeakMap (a,b) -> c
EN

Stack Overflow用户
提问于 2015-12-10 13:15:30
回答 2查看 504关注 0票数 1

我有一个fn回忆录,其中fn由两个输入引用来回传:

代码语言:javascript
复制
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)。当ab被垃圾收集时,游标也应该被垃圾收集。

refToHash是另一个回忆录函数,它使用WeakMap,以便仍然允许所看到的引用到GC。

NewRefCursor的回忆录要复杂得多,因为它使用两个参数来确定缓存命中,因此与WeakMap不兼容,因此将防止任何看到的引用被GC‘编辑。我对任何形式的欺骗都是开放的,将私有字段附加到输入对象、概率数据结构。这个漏洞需要解决。到目前为止,我唯一的解决方案是添加一个参数来记录缓存大小,并在每个应用程序的基础上对该参数进行调优。恶心。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-29 13:52:02

如果您创建了一个二级弱映射(在弱映射上存储弱映射),那么当第一级的obj被捕获时,就会失去整个第二级(当a被释放时,您就失去了b)。如果b是通用的,您将仍然有一个a的弱映射,只有在有另一对(a,什么)的情况下,它才会出现。这不是最好的实施,但我认为这就足够了:

代码语言:javascript
复制
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级的解决方案.这能解决你的问题还是我遗漏了什么?

票数 3
EN

Stack Overflow用户

发布于 2017-06-08 19:58:35

参见https://github.com/Dans-labs/dariah/blob/master/client/src/js/lib/utils.js中的回忆录,它通过构建所有作为对象的参数的WeakMap索引,以通用的方式解决了这个问题。WeakMap索引将唯一的整数分配给对象,然后可以通过stringify将对象与其他参数放在一起。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34202895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档