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

Javascript 为什么两个阵列克隆互相模仿?,javascript,arrays,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。它也保留了原始的原作 像这样

注意:我保留了原始变量名,作为本文底部原始代码的参考

如果我尝试在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),因为我打算在索引0处稍微更改克隆的外部数组(这样以后我就可以开始运行所有数组并进行比较)

我无法对其进行JSFIDEL,因为它太大,数据太多。我已经隔离了下面的代码,并且检查了又检查了我的数组对象,它们看起来和预期的一样

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]
也会改变?

。slice
只执行浅拷贝。它只是创建一个新数组,并将原始数组的所有值放在其中。你似乎在寻找深度复制/克隆。剪接似乎破坏了原来的array@8DK这跟它有什么关系?您没有使用
splice
。splice
用于在适当的位置突变数组。它允许您添加和删除元素。这与复制无关。“CC数组中的两个数组的行为就好像它们是深度复制的(如果我更改一个,那么另一个也会更改)…”这与深度复制相反。
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