Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.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 从阵列中删除不';是否更新变量内部的引用?_Javascript_Arrays_Object - Fatal编程技术网

Javascript 从阵列中删除不';是否更新变量内部的引用?

Javascript 从阵列中删除不';是否更新变量内部的引用?,javascript,arrays,object,Javascript,Arrays,Object,通常,改变对对象/数组的引用会改变对象,反之亦然 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 如果

通常,改变对对象/数组的引用会改变对象,反之亦然

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
如果所述索引的值发生变化,则对数组索引值(即对象)的引用不会发生变化-例如,如果通过
拼接
删除该值,则引用不会指向该索引处的新值。它仍然保留对已删除值的引用。为什么?

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
var someArr=[{letter:'a'},{letter:'b'},{letter:'c'}];
var测试=someArr[1];
一些arr.拼接(1,1);//移除带有字母b的对象

console.log(test.letter);//输出bsomeArr
中的对象不同,并且有自己的参考。您已将第二个对象的引用指定给
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中引用/指向其他对象,它更像是一个带有连续/递增键值的映射,而不是一个带有索引的数组

因此,在引擎盖下,数组的第二个元素
someArr
指向ram中的另一个对象
{letter:b}
。当您创建值
test
时,它还指向该特定对象。对该对象的更改通过数组
someArr
和var
test
反映出来

当您通过
拼接(1,1)
删除索引2处的引用时,它不再被数组
someArr
指向。但是,
test
仍然指出了这一点。(因此,在测试指向其他对象之前,它不会收集垃圾)

test
不是引用数组中的地址,
test
是引用创建
test
someArr
指向的对象/地址

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


在第二个示例中:您将第二个元素传递给varibale,然后从数组中删除第二个元素。所以,为什么test.letter给出的是b而不是c,这没关系。我认为c现在是第二个元素。因为从现在起,可以使用
someArr[1]
在拼接的帮助下访问第二个元素,所以可以删除第二个元素,使c成为第二个元素。然后数组被真正地改变了。是的,对第二个元素的引用并不反映这一点。那是我的问题。我现在知道它就是这样,但对我来说似乎不合逻辑。在第一个例子中:在我的控制台中,它打印的是k而不是h。谢谢你的回答。但它并不能真正回答为什么会发生这种情况。您自己说,在拼接后,第三个对象在第二个引用
someArr[1]
下可用,这正是变量
test
所包含的内容。然而,它输出了一些其他的东西。“someArr[1]-这正是变量
test
所持有的”-不,变量
test
持有对对象
{letter:'b'}
的引用,这在某种程度上是
someArray
@Igor中的第二项,谢谢你让我明白了这一点<代码>测试保存对对象的引用,而不是数组的索引。如果你愿意写一个句子,我会接受这个句子作为答案。@Sumit-很高兴我能帮上忙,因为我没有编辑说一些不同的话。我编辑添加了
test
没有引用
someArr[1]
,这就是我在问题中所说的。不管怎样,我感谢你的解释——它也有帮助+1我的道歉,将从我的回复中删除该声明!很高兴听到更多的解释:)