为什么两个阵列克隆相互模仿?

时间:2014-10-22 15:52:01

标签: javascript arrays

注意:我保留原始变量名称作为本帖底部原始代码的参考。

如果我尝试在chromes控制台中重现,那么我就不会发现我的错误......

示例简化而没有数组层:

var c = [0,1,2,3];

var CC = [c.slice(0),c.slice(0)];

var xA = -1;

CC[0] = [xA].concat(CC[0].slice(0,CC[0].length-1));

这产生两个数组,第一个是原始数据,第二个数组在开始时具有数字-1,并且从结尾开始缺少数字3。它也保持原始状态不受影响。

像这样:

c= [0,1,2,3];
CC=[
   [-1,0,1,2],
   [ 0,1,2,3]
];

问题在于,当我尝试在更复杂的环境中执行此操作时,CC阵列中的两个数组就像它们被深度复制一样(如果我改变了一个,那么另一个也会发生变化)。我认为发生的事情是我克隆了c数组,但它拥有的所有数组只是对原始数组的引用..

复杂环境

我有一个数组(c)里面有数组,内部数组每个都有一个额外的数组,三个值作为集合。结构如下:

var c=[[extraArray1,value1,value2,value3],[extraArray2,value1,value2,value3],...];

我尝试将数组c的两个克隆放入两个临时数组(CC)中,因为我打算在索引零处略微改变克隆的extraArrays(稍后我会开始遍历所有数组)并比较)

var CC=[c.slice(0),c.slice(0)]; //the first clone will be slightly altered

我无法使用JSFiddel,因为它太大而且数据太多。我已经隔离了下面的代码,并检查并再次检查了我的Array对象,它们看起来像预期的那样!

xA[13]=11.11111; // some number for the sake of this post
console.log(CC[0][13][0].indexOf(xA[13]));
// -1
console.log(CC[1][13][0].indexOf(xA[13]));
// -1

CC[0][13][0]=[xA[13]].concat(CC[0][13][0].slice(0,CC[0][13][0].length-1));
console.log(CC[0][13][0].indexOf(xA[13]));
// 0
console.log(CC[1][13][0].indexOf(xA[13]));
// 0

如果我改变CC[0][13][0]那么为什么CC[1][13][0]也会改变?

0 个答案:

没有答案