Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript js从两个数组中删除对象引用_Javascript_Arrays_Javascript Objects - Fatal编程技术网

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记住,不能删除文字(数字、字符串等),如果引用文字,则不能
删除它