从数组中删除不会更新变量内的引用?

Remove from Array doesn't update reference inside variable?

通常更改对 object/array 的引用会更改对象,反之亦然。

var someArr = [{letter: 'a'}, {letter: 'b'}, {letter: 'c'}];
var test = someArr[1];

test.letter = 'k';
// or
// someArr[1].letter = 'k'

console.log(test.letter); // outputs k
console.log(someArr[1].letter); // outputs k

如果所述索引的值发生变化,对数组索引值(它是一个对象)的引用将不会改变 - 例如如果通过 splice 删除该值,则该引用将不会指向在该索引处出现的新值。它仍然保留对已删除值的引用。为什么?

var someArr = [{letter: 'a'}, {letter: 'b'}, {letter: 'c'}];
var test = someArr[1];

someArr.splice(1, 1); // remove object with letter b

console.log(test.letter); // outputs b <-- Why not c?
console.log(someArr[1].letter); // outputs c

这是一个 JSFiddle http://jsfiddle.net/rf47jyxv/

我不想知道那个是那样的。我知道是这样的。 我想知道为什么会这样

为什么在 splice 之后,保存对 someArr[1] 的引用的变量 test 与直接调用 someArr[1] 不同?

someArr中的对象不同,有自己的引用。您已将第二个对象的引用分配给 test

所以,现在 test 有第二个对象的引用,从数组中删除第二个对象并没有删除引用,正如你可能想的那样,因为 test 仍然有第二个对象的引用对象完好无损。

拼接后,第三个对象代替了第二个对象,所以someArr[1]{letter: 'c'},所以记录c

var someArr = [{letter: 'a'}, {letter: 'b'}, {letter: 'c'}];

// diff refs ------^--------------^---------------^ say r1, r2, r3 and r1 != r2 != r3

var test = someArr[1]; // r2

someArr.splice(1, 1); // you removed r2 in array but it is still being referred by test

console.log(test.letter); // outputs b as test, still has the r2 reference
console.log(someArr[1].letter); // outputs c, as it has r3 reference.

变量 test 持有对对象 {letter: 'b'} 的引用,该对象在某些时候是 someArray.

中的第二项

我看到你接受了一个答案(其他两个都很好),但我想对正在发生的事情进行额外的描述。

JavaScript 中的数组并不是它们看起来的数组。 JavaScript 数组基本上是一个美化的 Javascript 对象。 JavaScript reference/point 中的数组到其他对象,它更像是一个带有 sequential/increasing 键值的映射而不是带有索引的数组。

所以在幕后,数组的第二个元素 someArr 指向 ram 中其他地方的对象 {letter:b}。当您创建值 test 时,它也指向该特定对象。对该对象的更改由 Array someArr 和 var test.

反映

当您通过 splice(1,1) 删除索引 2 处的引用时,您的数组 someArr 不再指向它。但是,它仍然被test指向。 (因此,在测试指向其他内容之前,它不会收集垃圾)。

test 不是在引用数组中的地址,test 是在引用一个 object/address,而 someArr 在您创建 test 时指向该地址。

以下阅读可能会有更多帮助:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array https://javascriptweblog.wordpress.com/2010/07/12/understanding-javascript-arrays/