深拷贝,浅拷贝

深拷贝,浅拷贝

浅拷贝

// 直接赋值浅拷贝
let obj = {a:1}
let obj2 = obj
obj2.a = 123
console.log(obj2,obj)
// assign 浅拷贝
let obj = {a:1}
let obj2 = obj
let obj3 = Object.assign(obj2,{a:'a'},obj)
obj3.a = 'adf'
console.log(obj,obj3,obj2)
// arr 浅拷贝
let arr = [1,2,{c:'c'}]
let arrClone = arr.concat()
arrClone[2].c = 'd'
arrClone[1].c = 'd'
console.log(arr)
// slice 浅拷贝
let arr = [1,2,{c:'c'}]
let arrClone = arr.slice()
arrClone[2].c = 'd'
arrClone[1].c = 'd'
console.log(arr)

深拷贝

// 序列化/反序列化
let obj = {a:'a'}
let obj2 = JSON.parse(JSON.stringify(obj))
obj2.a = 'b'
console.log(obj)
// 深拷贝完善方法,拷贝数组,对象,循环引用
function checkedType(target) {
    return Object.prototype.toString.call(target).slice(8,-1); //返回检测的数据类型
}
function clone(target) {
    //判断拷贝的数据类型
    //初始化变量result 成为最终克隆的数据
    let result,targetType=checkedType(target);
    if(targetType === 'Object'){
        result = {}
    }else if(targetType === 'Array'){
        result = []
    }else{
        return target;
    }
    //遍历目标数据
    for(let i in target){
        //获取遍历数据结构的每一项值
        let value = target[i];
        //判断目标结构里的每一项值是否存在对象/数组
        if(checkedType(value) === 'Object' || checkedType(value) === 'Array'){
            //继续遍历获取到的value值
           result[i]=clone(value);
        }else{ //获取到的value值是基本的数据类型或者是函数
            result[i]=value;
        }
    }
    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值