数组的深浅复制

// 数组的浅复制
let nums = [];
for(let i = 0; i < 10; i++){
    nums[i] = i + 1;
}
let samenums = [12,13,14,18,19];
samenums = nums;
nums[0] = 200;
console.log(samenums[0]);
console.log(samenums.length);
//把一个数组直接赋值给另一个数组为浅复制,但是新数组依然指向原来的数组,原来数组改变,新数组会跟着改变
//

//采用深复制来隔断复制后的数组对原来数组的依赖
//深复制将原来数组中的每一项都复制到目标数组中,相当于对目标数组的每一项都进行了重新赋值
function copy(arr1, arr2) {
    for(let i=0; i < arr1.length; ++i){
        arr2[i] = arr1[i];
    }
}
let nums1 = [];
for(let i = 0; i < 10; i++){
    nums[i] = i+1;
}
let samenums1 = [12,13,14,15,16];
copy(nums1, samenums1);
console.log(samenums); // 输出1到10
nums1[0] = 300;
console.log(samenums[0]); //输出1

//假设现在目标数组的长度比原来数组的长度要长,结果会怎么样
let array1 = [];
for(let i = 0; i < 100; ++i){
    array1[i] = i+1;
}
let array2 = [12,13,14,15,16];
copy(array2,array1);
console.log(array1); //12,13,14,15,16,6,7,8,9....100
array2[0] = 200;
console.log(array1[0]); //12
/*
* 从上面结果可以看到数组的深复制其实 是值代替,假如目标数组比原来数组大,则目标数组的前面几项会被原来数组取代
* 但是一般的数组复制一般都会拿一个空数组来作为容器或者中间的参数来进行复制
* */

数组深拷贝:

js 的slice 方法,要实现完全复制,arr1.slice(0),具体使用看文档:javascript string.slice()方法使用

js 的concat方法,连接一个空数组就可以返回相同的值,具体也可以看文档:js 的concat()方法使用

上面两个方法的局限:数组内部属性值为引用对象,使用slice()和concat(0方法对对象数组的拷贝,整个的拷贝还是浅拷贝,拷贝后的数组各个值的指针还是指向相同的存储地址,修改原对象数组还是会改变另一个拷贝后的数组。

除了遍历数组然后取出元素赋值给新数组,有无更好的解决办法?今天得知一方法,暴力至极:

JSON.parse(JSON.stringify(arr))  即可得到深拷贝的数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值