Javascript 是同一个关键弱点阻塞吗?

Javascript 是同一个关键弱点阻塞吗?,javascript,weakmap,Javascript,Weakmap,所以WeakMap在键上很弱。。。如果我有两个weakmap,它们都将DOM元素存储为具有不同值的键,该怎么办。让我们假设,我们不能将它们结合起来 如果我们从DOM中删除DOM元素,这意味着在某个时候,(键,值)对将从WeakMap中删除,对吗 如果有两个弱点,那还能用吗?或者它们会阻止对方删除它吗?如果两个weakmap都持有相同的元素作为密钥,那么是的,一旦元素从DOM中删除,垃圾收集器将可以从两个weakmap中自由删除它 唯一的问题是,如果weakmap以某种方式持有对元素的循环引用:不

所以WeakMap在键上很弱。。。如果我有两个weakmap,它们都将DOM元素存储为具有不同值的键,该怎么办。让我们假设,我们不能将它们结合起来

如果我们从DOM中删除DOM元素,这意味着在某个时候,(键,值)对将从WeakMap中删除,对吗


如果有两个弱点,那还能用吗?或者它们会阻止对方删除它吗?

如果两个weakmap都持有相同的元素作为密钥,那么是的,一旦元素从DOM中删除,垃圾收集器将可以从两个weakmap中自由删除它

唯一的问题是,如果weakmap以某种方式持有对元素的循环引用:不,正如Bergi所说,不同weakmap中的循环引用可以很好地进行垃圾收集,请参见示例。我必须将代码作为SE的示例,以便编辑答案,因此:

const delay = ms => new Promise(res => setTimeout(res, ms));
Promise.resolve()
  .then(async () => {
    const map1 = new WeakMap();
    const map2 = new WeakMap();
    console.log('not populated yet, check mem usage for jshell.net');
    await delay(5000);
    for (let i = 0; i < 1e5; i++) {
      const elm1 = document.createElement('div');
      const elm2 = document.createElement('div');
      map1.set(elm1, elm2);
      map1.set(elm2, elm1);
    }
    console.log('populated, check mem usage');
    await delay(5000);
    console.log('done, check mem usage');
    return [map1, map2];
  })
  .then(async (maps) => {
    await delay(1e9);
  });
constdelay=ms=>newpromise(res=>setTimeout(res,ms));
承诺,决心
。然后(异步()=>{
const map1=新的WeakMap();
const map2=新的WeakMap();
log('尚未填充,请检查jshell.net的mem用法');
等待延迟(5000);
for(设i=0;i<1e5;i++){
const elm1=document.createElement('div');
const elm2=document.createElement('div');
map1.set(elm1,elm2);
map1.set(elm2,elm1);
}
log('填充,检查mem用法');
等待延迟(5000);
log('done,check mem用法');
返回[map1,map2];
})
。然后(异步(映射)=>{
等待延迟(1e9);
});

结果是内存使用率先增加,然后保持在高位,然后降低-尽管存在循环引用,它们还是会获得GCd。

为什么会阻止彼此删除它?垃圾收集器可以很好地处理循环引用。如果没有一个dom元素从其他任何地方被引用,这两个元素都将被垃圾收集。酷,我希望听到这个!有没有办法测试这种行为?自动gc并没有很快发生,或者根本没有强大的机器。Bergi很可能是对的,我不确定。我将运行一些代码并测试内存usage@Fabian您可以从debugger@Fabian对于铬。我希望其他浏览器的开发工具也能起到类似的作用