手写深浅克隆 2021/3/3

1.深拷贝和浅拷贝的定义:

其实深拷贝和浅拷贝都是针对的引用类型,JS中的变量类型分为值类型(基本类型)和引用类型;对值类型进行复制操作会对值进行一份拷贝,而对引用类型赋值,则会进行地址的拷贝,最终两个变量指向同一份数据

2.浅拷贝的实现

 var obj={
            name:'abc',
            age:123,
            sex:'female',
            card:['1','2','3']
        }
        function shallowClone(origin){
            var target={};
            for(var prop in origin){
                if(origin.hasOwnProperty(prop)){
                    target[prop]=origin[prop];
                }
                
            }
            return target;
            
        }
        var obj2=shallowClone(obj);
        console.log(obj2);

3.递归方法来实现深拷贝
补充知识:如何判断数组和对象

第一种方法 利用constructor
控制台打印:[].constructor -----> f Array(){[native code]}
var obj = {} 控制台打印 obj.constructor ----->f Object(){[native code]}

第二种方法 利用 instanceof
[] instanceof Array ----->true
var obj = {}; obj instanceof Object ----> true

第三种方法 利用toString
Object.prototype.toString.call([]); -----> [object Array]
Object.prototype.toString.call({}); -----> [object object]
Object.prototype.toString.call(123); -----> [object Number]

function deepClone(origin,target){
            
            var target=target||{};
            for(var prop in origin){
                var str=Object.prototype.toString,
                arrStr='[object Array]';
                if(origin.hasOwnProperty(prop)){
                    if(typeof(origin[prop])=='object'){
                       if(str.call(origin[prop])==arrStr){
                           target[prop]=[];
                       }
                       else{
                           target[prop]={};
                       }
                      deepClone(origin[prop],target[prop]);
                    }
                    else{
                    target[prop]=origin[prop];
                }
                }
               
               

            }
           
        }
        deepClone(obj,obj1);

3.对于数组的concat和slice方法实现的是首层深拷贝

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值