当两个数组中存在相同的对象引用时,对象是等效的,更新一个会影响另一个。
但是,从一个数组中删除对象不会在另一个数组中删除它。
为什么不呢?
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}
答案 0 :(得分:1)
要回答为什么最后print(a2[0]);
仍然显示值,让我们开始分析代码。
你的a1
是一个数组,当你用对象初始化它时,它会创建对象并存储它们的引用。
var a1 = [
{i: 0, s: 'zero'}, // ref 1001
{i: 1, s: 'one'} // ref 1002
];
这一部分,您的评论很清楚,但是当您delete a1[0]
时会发生什么?
它会删除对象吗?答案为否。它将删除0
中a1
索引中存储的属性,并将其设置为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
该位置不再存在