深克隆和浅克隆

概括:深克隆和浅克隆 的主要区别就是:复制的是引用(地址)还是复制的是实例。
深克隆:主要复制的是实例,改变原对象,克隆的对象的内容不会随之改变,深克隆主要针对的是的例如Object,Array的复杂数据
浅克隆:主要复制的是引用的地址,改变原对象,克隆的对象会随之改变

浅克隆

数组的concat,对象的assign都是浅克隆
concat看起来很像深克隆,但是实质上他还是浅克隆,在Array.prototype.cancat 拷贝出来数组中的对象还是共享同一内存地址,所以本质上归属浅克隆

<script>
	var arr = [1,2,3,[2,3];
	var b = arr.concat();
	b[3][1] = 4;
	console.log(b)//[1,2,3[2,3]];
	var obj = {
		name: "lili",
		age : 12,
		a : {
			b : 1
		}
	} 
	var obj1 = obj;
	obj1.a.b = 3;
	console.log(obj.a.b);//3
</script>

深克隆

使用JSON.stringify实现深克隆

JSON.stringify方法可以将JS对象序列化成JSON字符串,JSON.parse方法可以将JSON字符串反序列化成JS对象,借助这两个方法,也可以实现对象的深克隆

<script>
	var obj2 = {
	       name:'lisa',
	       age:18,
	       info:{
	           job:'前端',
	           hobby:'敲代码'
	       }
	   };
	   var b = JSON.parse(JSON.stringify(obj2));
	   obj2.info.job = '明星';
	   console.log(obj2.info,b.info);
</script>
原生js实现深克隆
 <script>
    function Judge(param){
        //返回值为[object Array]  Array
        return Object.prototype.toString.call(param).slice(8,-1);
    }
    // console.log(Judge([1,2,3,3]))
    function clone(param){
        var result;
        // 判断是否为数组
        if(Judge(param) == 'Array'){
            result = [];
            // 判断是否为对象
        } else if(Judge(param) == 'Object'){
            result = {};
        } else{
            return param;
        }
        // 遍历数组里的值
        for(var i in param){
            var value = param[i];
            console.log(value);
            // 判断当前值是否为数组
            if(Judge(value) === 'Array' || Judge(value) === 'Object'){
                // 是数组就遍历里面的数
                result[i] = clone(value);
            }else {
                // 不是就直接赋值给result
                result[i] = value;
            }
        }
        return result;  
    }
    var arr = [5,2,3,4,{
        a : 3,
        b : 2
    },2,3,4];
        var arr1 = clone(arr);
        arr[4].a = 10;
        console.log(arr);
        console.log(arr1);

    // console.log(clone(['1234',1,2,32,[1,2,3]]));
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值