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,这个问题已经在这个链接中得到了回答。标记为重复的: