Javascript js从两个数组中删除对象引用
当两个数组中存在相同的对象引用时,对象是等效的,更新一个会影响另一个Javascript js从两个数组中删除对象引用,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,当两个数组中存在相同的对象引用时,对象是等效的,更新一个会影响另一个 delete a1[1].s; print(a1[1]); // {"i":1} print(a2[1]); // {"i":1} 但是,从一个数组中删除对象不会在另一个数组中删除它 delete a1[1].s; print(a1[1]); // {"i":1} print(a2[1]); // {"i":1} 为什么不呢 var a1 = [ {i: 0, s: 'zero'}, {i: 1, s: 'one
delete a1[1].s;
print(a1[1]); // {"i":1}
print(a2[1]); // {"i":1}
但是,从一个数组中删除对象不会在另一个数组中删除它
delete a1[1].s;
print(a1[1]); // {"i":1}
print(a2[1]); // {"i":1}
为什么不呢
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}
正如@Halcyon所说,您删除的是引用,而不是对象本身。要进行演示,请查看以下示例:
var a = 2
var b = [a, 2, 3, 4]
如果要
删除b[0]
,则只会删除引用,因此,a===2
。但是,如果要通过delete a
删除a
处的引用,则b
中的值将更改为undefined
,因为以前存在于该位置的引用不再回答上次打印的原因(a2[0])代码>仍然显示值,让我们开始分析代码
您的a1
是一个数组,当您使用对象初始化它时,它将创建对象并存储它们的引用
var a1=[
{i:0,s:'zero'},//ref 1001
{i:1,s:'one'}//ref 1002
];
根据您的评论,这一部分很清楚,但是当您删除a1[0]
时会发生什么
它会移除该对象吗?答案是否。它将删除存储在a1
中0
th索引处的属性,并将其设置为undefined
。但是,如果删除在该引用处保留的对象的属性,则该属性将显示在以下两种情况中:
那么这个物体会怎么样呢?该值将被保留,如果没有人引用它,它将被垃圾收集。在您的情况下,由于a2[0]
仍在访问它,因此它将保留该值
您可以检查以下内容以供参考。您删除的是对值的引用,而不是对值本身的引用。把它看作是给一个人起名字。如果你不再叫它们克里斯,它们不会突然消失。对象是通过引用来分配的。所以当您执行a1[0]
时,它将获取其引用并将其复制到数组中,并使用它访问值。因此,当您删除引用时,您将删除原始位置,因此它将反映在所有变量中,而不在数组上使用delete
。只需将索引设置为null
或undefined
@Bergi,既然数组是对象,那么使用delete
有害吗?我知道你正在创建一个有洞的数组,但这对标准来说不是问题APIs@MayorMonty是的,这是真的,但您正在替换存储在数组中的值,而不是更改ref本身,这正是我所期望的。但是在本例中,a
不会被删除@KevinCollins记住,不能删除文字(数字、字符串等),如果引用文字,则不能删除它