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

时间:2019-01-03 06:51:07

标签: javascript memory-leaks garbage-collection weakmap

删除对象时,weakmap会对其保持引用。
但是正常的行为是:当oyu删除对象时,它将自动从weakmap中删除,并且weakmap不会导致内存泄漏。
weakmapdelete有什么问题吗?

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}仍然存在。
期望weakmap为空

3 个答案:

答案 0 :(得分:2)

您的delete()函数应如下所示:

 w.delete(a.aa);

答案 1 :(得分:0)

您使用的是删除运算符,而不是弱映射的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);

文档link

答案 2 :(得分:0)

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

删除的原因

delete a.aa

仅仅是因为w是对象的单独引用,而不是pointer是同一对象的引用。

  

简单值(又称标量原语)始终由值复制分配/传递:空,未定义,字符串,数字,布尔值和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时,它会将a引用的副本分配给x。 x和是指向相同[1,2,3]值的单独引用。现在,在函数内部,我们可以使用该引用来改变值本身(push(4))。但是,当我们使赋值x = [4,5,6]时,这绝不会影响初始参考a指向的位置-仍然指向[1,2,3,4]值(现在已修改)。

将其读为this

希望清楚!