js从两个数组中删除对象引用

时间:2017-05-31 12:42:58

标签: javascript arrays javascript-objects

当两个数组中存在相同的对象引用时,对象是等效的,更新一个会影响另一个。

但是,从一个数组中删除对象不会在另一个数组中删除它。

为什么不呢?

var a1 = [
  {i: 0, s: 'zero'}, 
  {i: 1, s: 'one'}
];

var a2 = [
  a1[0],
  a1[1]
];

// items point to same reference
print(a1[0] === a2[0]); // true (equivalent)

// updating one affects both
a1[0].s += ' updated';
print(a1[0] === a2[0]); // true (still equivalent)
print(a1[0]); // {"i":0,"s":"zero updated"}
print(a2[0]); // {"i":0,"s":"zero updated"}

// however, deleting one does not affect the other
delete a1[0];
print(a1[0]); // undefined
print(a2[0]); // {"i": 0, "s": "zero"}

有趣的是,从一个属性中删除属性会影响另一个属性。

delete a1[1].s;
print(a1[1]); // {"i":1}
print(a2[1]); // {"i":1}

https://jsfiddle.net/kevincollins/4j6hj2v7/3/

2 个答案:

答案 0 :(得分:1)

要回答为什么最后print(a2[0]);仍然显示值,让我们开始分析代码。

你的a1是一个数组,当你用对象初始化它时,它会创建对象并存储它们的引用。

var a1 = [
  {i: 0, s: 'zero'}, // ref 1001
  {i: 1, s: 'one'}   // ref 1002
];

这一部分,您的评论很清楚,但是当您delete a1[0]时会发生什么?

它会删除对象吗?答案为否。它将删除0a1索引中存储的属性,并将其设置为undefined。但是,如果删除该引用所持对象的属性,它将同时显示:sample

然后对象会发生什么?该值保留,如果没有人引用它将被垃圾收集。在您的情况下,由于a2[0]仍在访问它,因此它将保留该值。

您可以查看以下sample以供参考。

答案 1 :(得分:0)

就像@Halcyon所说,你正在删除引用,而不是对象本身。要演示,请查看以下示例:

var a = 2
var b = [a, 2, 3, 4]

如果您是delete b[0],则只会删除引用,因此a===2。但是,如果您要通过a删除delete a处的引用,则b中的值将更改为undefined,因为以前存在的引用位于\n该位置不再存在