删除对象时,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}
仍然存在。
期望weakmap
为空
答案 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!
希望清楚!