我做了以下事情:
a = {a:1};
b = {b:1};
c = [a,b]
delete a;
现在我不明白为什么c还有两个对象:[a,b] 但当我尝试打印时,控制台会给我: 未捕获的ReferenceError:a未定义
似乎对象不再存在,但它仍然存在于数组中。
我也尝试打印:
typeof a //"undefined"
typeof c[0] //"object"
我确信在将对象分配给通过引用分配的变量时。似乎这里的对象已被复制了?
答案 0 :(得分:1)
与普遍看法不同,删除操作符没有任何内容 直接释放内存。内存管理是间接完成的 通过打破引用,请参阅内存管理页面了解更多信息 的信息。
阅读here
即使您删除了a
,a
的引用也会存储在c
中。
因此c
始终为object
类型。
a = {a:1};
b = {b:1};
c = [a,b];
delete a;
console.log(c);
以上代码将返回:
[
{
"a": 1
},
{
"b": 1
}
]
但如果您删除delete c[0].a
,则会从数组a
中删除c
:
a = {a:1};
b = {b:1};
c = [a,b];
console.log (delete c[0].a);
console.log(c);
输出将是:
[
{},
{
"b": 1
}
]
答案 1 :(得分:1)
delete
运算符从对象中删除属性。
也就是说,如果您有一个对象const obj = { a: 56, b: 62 }
并执行delete obj.b
,则b
属性将被删除,对象将只有{ a: 56 }
。
由于您没有声明任何变量,因此您隐式处理窗口对象。你的代码相当于:
window.a = {a:1};
window.b = {b:1};
window.c = [window.a, window.b]
delete window.a;
如您所见,您刚刚向window
对象添加了一些属性,然后删除其中一个属性。但是,您没有删除分配给该属性的对象。
JavaScript中的任何对象都将被保留,直到不再引用每个对象为止。在这里,仍然有一个对您希望在分配给window.c
的数组中删除的对象的引用,并且该对象不会被销毁。 (并考虑一下:如果对象被删除,你会期望在数组中出现什么?)