当两个数组中存在相同的对象引用时,这些对象是等价的,更新其中一个会影响另一个。
然而,在一个数组中删除对象并不会在另一个数组中删除它。
为什么呢?
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}
a1[0]
时,它将获取其引用并将其复制到数组中,并将使用它来访问值。因此,当您删除引用时,您会删除原始位置,因此它将反映在所有变量中。 - Rajeshdelete
。只需将索引设置为null
或undefined
。 - Bergidelete
会有什么危害呢?我知道你正在创建一个带洞的数组,但这对标准 API 来说并不是问题。 - bren