当两个数组中存在相同的对象引用时,对象是等价的,更新一个会影响另一个。
然而,从一个数组中删除对象并不会在另一个数组中删除它。
为什么不呢?
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}
最佳答案
要回答为什么最后的 print(a2[0]);
仍然显示值,让我们开始分析代码。
您的 a1
是一个数组,当您使用对象对其进行初始化时,它将创建对象并存储它们的引用。
var a1 = [
{i: 0, s: 'zero'}, // ref 1001
{i: 1, s: 'one'} // ref 1002
];
根据您的评论,这部分很清楚,但是当您执行 delete a1[0]
时会发生什么?
它会移除对象吗?答案是否定的。它将删除存储在 a1
中第 0
索引处的属性并将其设置为 undefined
。但是,如果您删除在该引用处保存的对象的属性,它将同时显示在两者中:sample
然后对象会发生什么?该值将被保留,如果没有人引用它,将被垃圾收集。在您的情况下,由于 a2[0]
仍在访问它,因此它将保留该值。
您可以查看以下sample供引用。
关于javascript - js从两个数组中删除对象引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44285162/