js 对象的深复制和浅复制

浅复制:只赋值一层对象,并不递归赋值对象内嵌套的对象
深复制:递归赋值对象中的所有值和对象

1.数组的浅复制 – slice

var arr_1 = [1,2,3];
var arr_2 = arr_1.slice(0);//slice方法取出数组的每一项传入一个新数组

arr_2.push(4);
console.log(arr_1);//[1,2,3]
console.log(arr_2);//[1,2,3,4]

2.数组的浅复制 –concat

var arr_1 = [1,2,3];
var arr_2 = arr_1.concat();//concat方法取出数组的每一项传入一个新数组

arr_2.push(4);
console.log(arr_1);//[1,2,3]
console.log(arr_2);//[1,2,3,4]

3.数组的深复制 –JSON.stringify (同样适用于对象)

//这个方法不能复制数组中带有非json数据格式,不允许的数据类型例如Function

var arr_1 = [1,2,{a:3}];
var arr_2 = JSON.parse(JSON.stringify(arr_1));//数组转为JSON字符串再转为数组

arr_2[2].a = 4;
console.log(arr_1);//[1,2,{a:3}]
console.log(arr_2);//[1,2,{a:4}]

4.对象的的浅复制 –for in (同样适用于数组)

var obj_1 = {a:1,b:2}

function copy(obj){
    var newObj = {};

    for(var key in obj){
        newObj[key] = obj[key]
    }

    return newObj
}

var obj_2 = copy(obj_1);
obj_2.b = 3;

console.log(obj_1)//{a:1,b:2}
console.log(obj_2)//{a:1,b:3}

5.对象、数组的深拷贝

var obj_1 = {
    school:'哈弗',
    grade:{
        level_1:[1,2,3]
    }
}

function copy(obj){
    if(Object.prototype.toString.call(obj) === '[object Array]'){
        var newObj = [];
    }else{
        var newObj = {};
    }

    for(var key in obj){
        newObj[key] = (typeof obj[key] ==='object' ? copy(obj[key]) : obj[key]);

    }
    return newObj
}

var obj_2 = copy(obj_1);
obj_2.school = '清华';
obj_2.grade.level_1.push(4);

console.log(obj_1.school)//哈弗
console.log(obj_2.school)//清华
console.log(obj_1.grade.level_1)//[1,2,3]
console.log(obj_2.grade.level_1)//[1,2,3,4]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值