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]]

成功达到了预期的结果

转载于:https://www.cnblogs.com/pacific0437/archive/2012/10/22/2733986.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值