<!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'] = '合肥'