浅拷贝和深拷贝

浅拷贝与深拷贝的区别:

浅拷贝基本类型之前互不影响,引用类型其中一个对象改变了地址,就会影响另一个对象

深拷贝改变新对象不会影响原对象,他们之前互不影响。

一.浅拷贝

浅拷贝只拷贝一层,更深层次对象级别只拷贝地址

当我们把 obj对象里面的内容拷贝给了 o之后,修改o 里面的值,obj 也会相应的改变

对对象进行浅拷贝的方法有两种

一是利用 for in 循环,把原有 obj 对象里面的每一项都拷贝一个空对象 o 

二是利用es6新增的语法 Object.assign(o,obj)

<script type="text/javascript">
		var obj = {
			name:'张三',
			age:21,
			fn:{
				sex:'女'
			}
		}
		var o = {}
		/* 遍历对象,把 obj 的值,给 o */
		for(var k in obj){
			o[k] = obj[k]
		}
		/* 	// es6 新增方法实现浅拷贝
			Object.assign(o,obj)
			console.log(o); */
		console.log(o);
		// 改变 o 的值,obj 的纸也随之改变 
		o.fn.sex = '男';
		console.log(obj);
	</script>

二.深拷贝

深拷贝拷贝多层,每一级别的数据都会拷贝

 obj对象会开辟一个新的空间,深拷贝就是 obj对象 在新的空间里面又重新复制了一个空间,然后把拷贝过的空间给 o对象。相当于A有一份文档,B想拿过来改一下,但是会影响A里面的内容,于是A就先自己复制了一份,把新复制的给了B

实现深拷贝(递归的的方法)

注意:判断item的数据类型时,Array 要写在 Object 的前面,因为 数组是特殊的对象

<script type="text/javascript">
			var obj = {
				name:'张三',
				age:21,
				fn:{sex:'女'},
				color:['red','yellow','blue'],
			}
			var o = {}
			// 封装函数
			function deepCopy(newobj,oldobj){
				for(var k in oldobj){
					// 判断属性值属于那种类型,获得属性值 obj[k]
					var item = oldobj[k]
					// 判断属性值是不是复杂类型、
					// 判断是否为数组
					if(item instanceof Array){
						newobj[k] = []
						deepCopy(newobj[k],item)
						// 判断是否为对象
					} else if(item instanceof Object){
						newobj[k] = {}
						deepCopy(newobj[k],item)
					}else{
						// 这是简单数据
						newobj[k] = item;
					}
				}
			}
			deepCopy(o,obj)
			console.log(o)
			o.age = 22;
			o.name = '李四';
			console.log(o);
			console.log(obj);
	</script>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值