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

标签 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/

最佳答案

要回答为什么最后的 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/

相关文章:

c++ - 在 C++ 中对结构体数组进行排序

Javascript - 如何创建函数的新实例

javascript - 如何使用 JavaScript 连接两个 JavaScript 对象

javascript - 如何将数据绑定(bind)到多选?

c++ - 对象指针数组的动态分配

javascript - 如何使用javascript计算每页的项目数及其索引?

c - 可靠地确定数组中元素的数量

javascript - 防止通过引用创建的对象在原始对象更改时发生更改

javascript - PHP select from 语句when,不起作用

javascript 日期时间到字符串并返回日期时间?