删除对象时JavaScript奇怪的行为

时间:2017-06-18 08:24:09

标签: javascript object variable-assignment

我做了以下事情:

a = {a:1};
b = {b:1};

c = [a,b]

delete a;

现在我不明白为什么c还有两个对象:[a,b] 但当我尝试打印时,控制台会给我: 未捕获的ReferenceError:a未定义

似乎对象不再存在,但它仍然存在于数组中。

我也尝试打印:

typeof a //"undefined"

typeof c[0] //"object"

我确信在将对象分配给通过引用分配的变量时。似乎这里的对象已被复制了?

2 个答案:

答案 0 :(得分:1)

  

与普遍看法不同,删除操作符没有任何内容   直接释放内存。内存管理是间接完成的   通过打破引用,请参阅内存管理页面了解更多信息   的信息。

阅读here

即使您删除了aa的引用也会存储在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的数组中删除的对象的引用,并且该对象不会被销毁。 (并考虑一下:如果对象被删除,你会期望在数组中出现什么?)