javascript弱映射保留对已删除对象的引用

javascript弱映射保留对已删除对象的引用,javascript,memory-leaks,garbage-collection,weakmap,Javascript,Memory Leaks,Garbage Collection,Weakmap,删除对象时,weakmap保留对该对象的引用。 但正常的行为是:当oyu删除对象时,它将自动从weakmap中删除,而weakmap不会导致内存泄漏。 weakmap或delete是否有问题 let a = { aa : { aa : 123 } }; const w = new WeakMap(); w.set(a.aa,"hello"); delete a.aa console.log(w);// shows that '{aa:123}' is still there in weakma

删除对象时,
weakmap
保留对该对象的引用。
但正常的行为是:当oyu删除对象时,它将自动从weakmap中删除,而weakmap不会导致内存泄漏。
weakmap
delete
是否有问题

let a =  { aa : { aa : 123 } };
const w = new WeakMap();
w.set(a.aa,"hello");
delete a.aa
console.log(w);// shows that '{aa:123}' is still there in weakmap
我已经关闭并打开了devtool,
{aa:123}
仍然在那里。
您的
delete()
函数应该如下所示:

 w.delete(a.aa);

您正在使用delete运算符,而不是弱映射的delete属性

var a =  { aa : { aa : 123 } };
var w = new WeakMap();
w.set(a.aa,"hello");
console.log(a.aa)
w.delete(a.aa); // try this 
console.log(w);

文档

但是我没有使用过
weakmap
,但是没有通过

删除a.aa

只是因为
w
是对对象的单独引用,而不是对同一对象的
指针

简单值(也称为标量原语)总是通过值副本分配/传递:null、未定义、字符串、数字、布尔值和ES6的符号

复合值——对象(包括数组和所有装箱对象包装器——参见第3章)和函数——总是在赋值或传递时创建引用的副本

考虑以下代码段:

function foo(x) {
 x.push( 4 );
 x; // [1,2,3,4]

 // later
 x = [4,5,6];
 x.push( 7 );
 x; // [4,5,6,7]
}

var a = [1,2,3];

foo( a );

a; // [1,2,3,4]  not  [4,5,6,7]
当我们传入参数a时,它将引用的副本指定给x。x和是指向相同[1,2,3]值的单独参考。现在,在函数内部,我们可以使用该引用来改变值本身(push(4))。但是当我们赋值x=[4,5,6]时,这不会影响初始引用a指向的位置——仍然指向(现在修改的)[1,2,3,4]值

给我读一读


希望能说清楚

你说得对,但我的问题不是从weakmap中删除什么。弱映射被称为具有弱引用的东西。这意味着,当您删除在weakmap中具有引用的对象时,弱对象无法阻止该对象
gc
。所以weakmap不会导致内存泄漏。但是在我的代码中,即使我正在删除对象,weakmap也会阻止
gorbage收集器
删除对象。我的问题是weakmap为什么做这样的事?请看并尝试以下内容:我的问题不是从weakmap中删除某些内容。我的问题是:weakmap的要点是:当您删除weakmap中有引用的对象时,weakmap会删除其中的对象,以便
gc
能够从内存中删除该对象。但在我的例子中,即使我正在删除对象,weakmap也会保留对对象的引用,这会导致
gc
在删除对象
{aa:123}
时失败。这会有帮助:我想你可以得到,你在这里寻找的东西哦,我的上帝。是的,这就是答案。非常感谢你,weakmap和普通对象不一样。weakmap被称为
weak
,因为它持有对对象的弱引用,而这
弱引用
意味着当您删除对象本身>时,它将自动从weakmap中删除,
w
中的弱引用无法阻止
gorbage collector
删除对象。看看这个答案:感谢@komal bansal,这个问题已经在这个链接中得到了回答。标记为重复的: