js 浅拷贝 与 深拷贝

浅克隆:只克隆第一级属性,如果某个属性又是一个内嵌的子对象,不会进入子对象中克隆子对象的内容,而是将指向的地址赋给属性。

  var stu = {
            name : "xingxing",
            aclass: "五年级六班",
            age:12,
            sex : "男",
            address:{
                province : "河南省",
                city:"郑州市",
                area:"金水区"
            }
        }
        function clone(student){
            if(student == null){
                return null;
            }
            var stu1 = Array.isArray(student)?[]:{};
            //1、利用for循环遍历进行赋值
            // for(var key in stu){
            //     stu1[key] = stu[key];
            // }
            //2、打散对象,复制对象
            var stu1 = {...stu};
            return stu1;
        }
        var stu1 = clone(stu);
        console.log(stu1 == stu);//false
        console.log(stu1.address == stu.address);//true

深克隆:既可以克隆第一级属性,如果某个属性又是一个内嵌的子对象,深克隆会进入子对象中,继续克隆内嵌子对象及其内容。核心思想是递归,当发现对象内部某个属性仍然是对象是,会继续调用克隆函数继续进行赋值。

 var stu = {
            name : "lilie",
            aclass: "五年级六班",
            age:12,
            sex : "男",
            address:{
                province : "河南省",
                city:"郑州市",
                area:"金水区"
            }
        }
        function deepclone(stu){
            if(stu == null){
                return null;
            }
            // 数组是特殊的对象类型
            if(typeof stu!== "object"){
                return stu;
            }

            var newstu = Array.isArray(stu)?[]:{};

            for(var key in stu){
                newstu[key] = deepclone(stu[key]);
            }
            return newstu;
        }
        var stu1 = deepclone(stu);
        console.log(stu1);
        console.log(stu1 == stu);//false
        console.log(stu1.address == stu.address);//false

第二种,利用JSON来实现

function deepClone(oldObj){
       let newObj = JSON.stringify(oldObj);
       return JSON.parse(newObj);
}

第三种

function deepClone(oldObj){
    if(oldObj === null){
         return null;   
     }else if({}.toString.call(oldObj) === '[object Array]'){
         var newArr = [];
         newArr = oldObj.slice();
         return newArr;
    }else if(typeof oldObj !== "object"){
         return oldObj
    }
     var newArr = null;
	 for(let key in oldObj){
		 if(typeof oldObj[key] !== "object"){
			 newArr[key] = oldObj[key]
		 }else{
			 newArr[key] = deepClone(oldObj[key])
		 }
	 }
	 return newArr;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值