深拷贝中递归方法的解释

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>深拷贝</title>
	</head>
	<body>
	</body>
	<script>
		var obj = {
			name : '张三',
			hobby : ['吃饭','睡觉','打豆豆'],
			address : {
				newadd : '合肥'
			}
		}
		
		var newobj = []
		
		function demo(newobj,obj){
			for (let key in obj) {
				let value = obj[key]
				if(obj[key] instanceof Array){  //如果是数组类型
					newobj[key] = []           //开辟新的内存空间
					demo(newobj[key] , value)
				}else if(obj[key] instanceof Object){ //如果是对象类型
					newobj[key] = {}			//开辟新的内存空间
					demo(newobj[key] , value)
				}else{    //如果是基本数据类型,直接赋值
					newobj[key] = value
				}
			}
		}
		demo(newobj,obj)
		obj['hobby'].push('学习')
		console.log(newobj);
// 执行原理 : 注意 obj[key] 等同于 obj.key  ,这里的key是动态的
		// 第一次执行 key是name ,即obj[key] === obj['name'] 所以值为 '张三'  然后进行判断。 判断类型是基本数据类型,直接赋值
		
		// 第二次 :  key是hobby ,即obj[key] === obj['hobby'] 所以值为 ['吃饭','睡觉','打豆豆']  然后进行判断。 判断类型是数组类型,此时newobj[key]也就是newobj['hobby'] /newobj.hobby  创建一个空的数组
		// 此时再次调用函数进行判断 此时的 newobj[key] /newobj['hobby']  是一个空数组 ,而value是 ['吃饭','睡觉','打豆豆']  ,此时的 obj[key] 中的key就是下标了,即 0,1,2,所以这时的value就是 '吃饭','睡觉','打豆豆'
		// 所以又是基本类型了,又到直接赋值这一步 ,这里的 newobj[key] 也是 下标哦 ,所以如此反复,就实现了深拷贝,  newobj[0] =  '吃饭'  newobj[1] =  '睡觉'  newobj[2] =  '打豆豆'
		
		// 第三次 :   key是address    即obj[key] === obj['address']   所以值为 { newadd : '合肥'} ,  然后进行判断。 判断类型是对象类型 , 此时newobj[key]也就是newobj['address'] /newobj.address  创建一个空的对象
		// 此时再次调用函数进行判断  此时的 newobj[key] /newobj['address']  是一个空对象 ,而value是  { newadd : '合肥'}  ,此时的 obj[key] 中的key就是 newadd 了  所以这时的value就是 '合肥'  所以又是基本类型了,
		// 又到直接赋值这一步   newobj['newadd'] = '合肥'		
		
	</script> 
</html>

// 执行原理 : 注意 obj[key] 等同于 obj.key  ,这里的key是动态的
        // 第一次执行 key是name ,即obj[key] === obj['name'] 所以值为 '张三'  然后进行判断。 判断类型是基本数据类型,直接赋值
        
        // 第二次 :  key是hobby ,即obj[key] === obj['hobby'] 所以值为 ['吃饭','睡觉','打豆豆']  然后进行判断。 判断类型是数组类型,此时newobj[key]也就是newobj['hobby'] /newobj.hobby  创建一个空的数组
        // 此时再次调用函数进行判断 此时的 newobj[key] /newobj['hobby']  是一个空数组 ,而value是 ['吃饭','睡觉','打豆豆']  ,此时的 obj[key] 中的key就是下标了,即 0,1,2,所以这时的value就是 '吃饭','睡觉','打豆豆'
        // 所以又是基本类型了,又到直接赋值这一步 ,这里的 newobj[key] 也是 下标哦 ,所以如此反复,就实现了深拷贝,  newobj[0] =  '吃饭'  newobj[1] =  '睡觉'  newobj[2] =  '打豆豆'
        
        // 第三次 :   key是address    即obj[key] === obj['address']   所以值为 { newadd : '合肥'} ,  然后进行判断。 判断类型是对象类型 , 此时newobj[key]也就是newobj['address'] /newobj.address  创建一个空的对象
        // 此时再次调用函数进行判断  此时的 newobj[key] /newobj['address']  是一个空对象 ,而value是  { newadd : '合肥'}  ,此时的 obj[key] 中的key就是 newadd 了  所以这时的value就是 '合肥'  所以又是基本类型了,
        // 又到直接赋值这一步   newobj['newadd'] = '合肥'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值