在javascript中释放未使用的共享对象的最佳方法是什么?

在javascript中释放未使用的共享对象的最佳方法是什么?,javascript,architecture,software-design,Javascript,Architecture,Software Design,这是一个与Javascript语言能力密切相关的软件架构师问题。我有C++背景,现在我尝试用缓存来构造一些中等大小的解决方案。 下面是typescript中的一些伪代码,说明了问题: class CacheHolder { cacheItems: Map<number, SharedCachedItem> get(id:number): SharedCachedItem { let item = cacheItems.get(id);

这是一个与Javascript语言能力密切相关的软件架构师问题。我有C++背景,现在我尝试用缓存来构造一些中等大小的解决方案。 下面是typescript中的一些伪代码,说明了问题:

class CacheHolder {
    cacheItems: Map<number, SharedCachedItem>

    get(id:number): SharedCachedItem {
        let item = cacheItems.get(id);
        if(item)
            return item;

        item = new SharedCachedItem();
        // ... here loads item somehow ...
        cacheItems.set(id, item);
        return item;
    }
}
类缓存持有者{
缓存项:地图
获取(id:编号):SharedCachedItem{
let item=cacheItems.get(id);
如果(项目)
退货项目;
item=新的SharedCachedItem();
//…这里以某种方式加载项目。。。
cacheItems.set(id,item);
退货项目;
}
}
我希望SharedCachedItem在未使用时被释放(即,除了CacheHolder之外,其他任何地方都没有引用)。 CacheHolder.cacheItems持有对所有SharedCachedItem的永久引用,这防止Javascript对它们进行垃圾收集,因此我被迫手动实现一些内存管理

Java解决方案

简单明了:

Map<number, WeakReference<SharedCachedItem> >
Map
遗憾的是,Javascript中没有弱引用。还是我遗漏了什么? 注意:我知道WeakMap,它似乎对此没有用处,因为它只支持键的“弱”,而不支持值:
(new WeakMap())。set(1,{})
抛出异常

C++中的解决方案

《C++内存管理》总是由手工制作的。 我将使用SharedCachedItem()的引用计数与RAII原则一起管理这个“引用持有者”对象

遗憾的是,RAII在Javascript中是不可能的。还是我遗漏了什么

<强>最后的C++风格解决方案<强> < /P> 使用引用计数并在使用完成后手动调用.release()。这就是我现在要实现的。 此解决方案的问题是“.release()”很容易被忘记,特别是对于try..catch中出现异常的情况

因此,问题是:


在javascript中释放未使用的共享对象的最佳方法是什么?

和@ponury kostek No。您甚至无法将数字键设置到WeakMap中。试试这个:让m=newweakmap();m、 集合(1,{});