从数组中删除不会更新变量内的引用?
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/
通常更改对 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/