Javascript 数组复制
项目中遇到一个问题,浓缩一下就是
var a = [[1,2,3],[4,5,6]];
var b = a;
b[0][1] = 'aaa';
本意是将数组a复制为b,对b进行操作(会改变b的值)时a保持不变
结果如下
b = [[1,'aaa',3],[4,5,6]];
a = [[1,'aaa',3],[4,5,6]]
改变b的时候 a也跟着改变了
错误的原因在于array是引用类(和java类似,引用类型的赋值同基本类型是有区别的)
数组的复制可以利用slice()和concat()方法,试下这个例子:
var a = [1,2,3];
var b = a. concat(); //或者var b = a.slice(0);
b[1] = ‘aaa’;
结果如下
a=[1,2,3]
b=[1,’aaa’,3]
果真有效!那好,照葫芦画瓢把第一段的代码修改一下:
var a = [[1,2,3],[4,5,6]];
var b = a. concat();
b[0][1] = 'aaa';
运行一看:
b = [[1,'aaa',3],[4,5,6]];
a = [[1,'aaa',3],[4,5,6]]
晕啊,怎么没作用呢?
因为看不到concat的实现过程,所以我只能猜了……
Concat可能是分别把原数组中的元素赋给新数组中的对应元素,第二段代码中因为是一维数组,元素基本类型为数字,所以复制过去没问题,而第三段代码是二维数组,其元素为一维数组,是引用类型,这种复制自然是引用了,改变了其中一个子数组中的元素,另一个也就相应改变了
于是又写了下面一段代码:
var a = [[1,2,3],[4,5,6]];
var b = a.map(function(x){return x.concat()});
b[0][1] = ‘aaa’;
结果
a=[[1,2,3],[4,5,6]]
b=[[1,'aaa',3],[4,5,6]]
成功达到了预期的结果