深拷贝与浅拷贝

浅拷贝:藕断丝连
深拷贝:老死不相往来

  • 赋值号对于基本类型是深拷贝,对于引用类型是浅拷贝
let a = 1
let b = a
b = 2
console.log(a,b);//1 2 深拷贝

let arr = [1,2,3]
let brr = arr
brr.push(4)
console.log(arr,brr); //[1,2,3,4] [1,2,3,4] 浅拷贝

let obj = {
            name: "ni",
            age: 18,
            attr: {sex:'女',x:"student"}
        }
let newObj = obj
newObj.age = 28
newObj.attr.x = 'teach'
console.log(obj,newObj);  //都改变 浅拷贝
  • 解构赋值对于一维变量来说是深拷贝,对于多维变量来说是浅拷贝
let arr2 = [1,2,3]
let newArr2 = [...arr2] //解构赋值是浅拷贝 
newArr2.push(5)
console.log(arr2,newArr2);//不受影响 一维 深拷贝

let arr3 = [1,2,[5,4]]
let newArr3 = [...arr3]
newArr3[2].push(9)
console.log(arr3,newArr3); //受影响 二维 浅拷贝 
  • 实现深拷贝—快速实现
    一行代码解决,受限(function,undefined,复杂对象都不行)
let newObj = JSON.parse(JSON.stringify(obj))    //实现深拷贝 
//function,undefined类型不行,复杂对象不行
newObj.age = 28
newObj.attr.x = 'teach'
console.log(obj,newObj);   //obj不变 深拷贝 
  • 实现深拷贝–通用方法
//深拷贝
function deepClone(obj) {
    //判断是数组还是对象 所有基类是Array | Object
    const targetObj = obj.constructor === Array ? []:{}
    for(let keys in obj){
        //容错处理 判断obj中是否有keys属性
        if(obj.hasOwnProperty(keys)){
            if(obj[keys] && typeof obj[keys] === "object"){
                //处理对象和数组  因为typeof数组也是object
                //小的 临时的 容器
                targetObj[keys] = obj[keys].constructor === Array ? []:{}
                //递归
                targetObj[keys] = deepClone(obj[keys])
            }else{
                //基本数据类型
                targetObj[keys] = obj[keys]
            }
        }
    }
    return targetObj
}

let newObj = deepClone(obj)
newObj.age = 28
newObj.attr.x = 'teach'
console.log(obj,newObj);  //obj不变 深拷贝
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值