【问题标题】:JavaScript weird behavior when object deleted删除对象时的 JavaScript 奇怪行为
【发布时间】:2017-11-20 15:18:26
【问题描述】:
我做了以下事情:
a = {a:1};
b = {b:1};
c = [a,b]
delete a;
现在我不明白为什么 c 仍然有两个对象:[a, b]
但是当我尝试打印时,控制台给了我:
Uncaught ReferenceError: a is not defined
似乎对象不再存在,但它仍然存在于数组中。
我也试过打印:
typeof a //"undefined"
typeof c[0] //"object"
我确信当将一个对象分配给一个变量时,它是通过引用分配的。好像这里的对象被复制了?
【问题讨论】:
标签:
javascript
object
variable-assignment
【解决方案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 的数组中仍然有一个对您希望删除的对象的引用,并且该对象没有被销毁。 (想一想:如果对象已被删除,您希望数组中的内容是什么?)
【解决方案2】:
与普遍认为的不同,删除操作符没有什么可做的
直接释放内存。内存管理是间接完成的
通过中断引用,请参阅内存管理页面了解更多信息
详情。
阅读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,那么它会从数组c 中删除a:
a = {a:1};
b = {b:1};
c = [a,b];
console.log (delete c[0].a);
console.log(c);
输出将是:
[
{},
{
"b": 1
}
]