深度克隆与浅度克隆

浅度克隆与深度克隆的区别

浅度克隆

主要是将数据的地址赋给对应的变量但并没有将具体的值赋值给对应的变量,变量会随着数据的改变而改变

<script>
	var obj = {
		name:'张三',
		age:18,
		sex:'male',
		grade:['English:80','Chinese:80','Math:90']
	}
	var obj = {};
	function clone(orgin,target){
			var target = target || {};
				for(var prop in target){
						target[prop] = orgin[prop]
				}
				return target;
	}
	clone(obj,obj1);
</script>

在这里插入图片描述将obj的值克隆过来,所以产生了一个新的数据也就有了新的地址,原数据的改变不会影响新的数据变化

其他几种浅克隆的方法
1.如果克隆对象是基本类型,直接复制就可以

<script>
	var str1 = "abc"
	var str2 = str1
	console.log(str2)//abc
	str1 = '123'
	console.log(str2)//abc
</script>

2.不是基本类型就不可以直接复制,以数组

<script>
	var a = [1,2,3,4]
	var b = a;
	var c = b;
	c.pop();

	console.log(a);//[1,2,3]
	console.log(b);//[1,2,3,]
	console.log(c);//[1,2,3]
</script>

3.比较简单的遍历数组赋值

<script>
	var a = [1,2,3,4];
	var b = [];
	for(var i = 0;i<arr.length;i++){
		b.push(a[i])
	}
	console.log(b);//[1,2,3,4]
</script>

4.slice方法
返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。
如果 end 未被规定,那么 slice() 方法会选取从 start 到数组结尾的所有元素。
从index = 0开始到结尾没有存在没有获取不到的,可以实现克隆。
请注意,该方法并不会修改数组,而是返回一个子数组。如果想删除数组中的一段元素,应该使用方法 Array.splice()。

<script>
	var arr1 = [1,2,3,4]
	var arr2 = arr1.slice(0);
	console.log(arr2);
	arr1 = [4,2,3,1]
	console.log(arr2)//[1,2,3,4]
</script>

5.assign实现

<script>
	var obj = {a:1};
	var copy = object.assign({},obj);
	consolle.log(copy);//{a:1}

	var arr = [1,2,3];
	var copy = Object.assign([],arr);
	console.log(copy);//[1,2,3]

</script>

深度克隆

是将数据赋值给响应的变量,所以产生了一个新的数据也就有了新的地址,元数据的改变不会影响新的数据

<script>
        var obj1 = {}
        function deepClone(origin, target) {
            var target = target || {}; //以防用户没传,默认是对象
            for (var prop in origin) {
                //hasOwnProperty是用来判断某个属性是不是在对象自己的属性,它不会检测到原型链上去
                if (origin[prop] !== null && origin.hasOwnProperty(prop)) { //一定得确定对象上的属性不是原型链上的
                    if (typeof (origin[prop]) == 'object') { //判断是不是原始值
                        //在不是原始值的情况下,判断是数组还是对象
                        target[prop] = Object.prototype.toString.call(origin[prop]) == '[object Array]' ? [] : {};
                        deepClone(origin[prop], target[prop]);

                    } else {
                        target[prop] = origin[prop];
                    }
                }

            }
            return target;
        }
        var obj = {
            name: 'du',
            age: 21,
            brother: {
                name: 'rui',
                age: 12
            }
        };
</script>

在这里插入图片描述其他深克隆

<script>
	let arr1 = [1,2,3,4];
	let arr2 = arr1.concat()
   arr2[1] = 9
   console.log(arr1,arr2);//[1,2,3,4],[1,2,3,4] 
</script>
<script>
	  var obj={
     		name:'du',
     		age:21,
     		borther:{
     		    name:'rui',
     		    age:12
     		}
     	};
     	var obj1 = JSON.parse(JOSN.stringify(obj));
     	
</script>

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值