1

删除对象时,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是空的

4

3 回答 3

3

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

 w.delete(a.aa);
于 2019-01-03T06:55:32.867 回答
0

但是我没有使用过,weakmap但是没有删除的原因

delete a.aa

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

简单值(又名标量原语)总是通过值复制分配/传递:null、undefined、string、number、boolean 和 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] 值。

给它一个阅读

希望它说清楚!

于 2019-01-03T07:29:32.233 回答
0

您正在使用删除运算符而不是弱映射的删除属性。

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);

文档链接

于 2019-01-03T07:04:49.927 回答