<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
//递归函数:在函数内部函数自己调用自己
//深拷贝:深拷贝在拷贝对象的时候,依次遍历对象中的值进行拷贝
// 想要得到对象中的值:使用for in 遍历对象
// for in 遍历对象
// let obj ={}
// for(let key in obj ){
// //key:就是obj对象中的每一个键
// // obj[key]
// }
// //原生js实现深拷贝
// let obj1 = {
// name: 'zs',
// age : 23
// }
// let obj2 = {
// };
// //通过递归函数实现将obj1中的值拷贝到obj2
// //代码实现:
// function clone(newobj,oldobj) {
// // newobj: obj2空对象
// // oldobj: obj1原来的对象
// for (const key in oldobj) {
// newobj[key] = oldobj[key];
// }
// }
// clone(obj2,obj1)
// //打印拷贝后的值
// console.log(obj2);
//原生js实现深拷贝
let obj1 = {
name: 'zs',
family:{
fname:'老狗'
},
like:['蔡徐坤','鸡你太美']
}
let obj2 = {
// family:{}
// obj2里面应该也要有family
// family是一个对象
};
//通过递归函数实现将obj1中的值拷贝到obj2
//代码实现:
function clone(newobj,oldobj) {
// newobj: obj2空对象
// oldobj: obj1原来的对象
for (const key in oldobj) {
newobj[key] = oldobj[key];
//判断当前值是不是一个对象
// instanceof是用来判断前者是不是属于后者(对象)
if (oldobj[key] instanceof Array) {
newobj[key] = [];
clone(newobj[key]= oldobj[key])
}else if(oldobj[key] instanceof Object){
// obj2对象中必须将属性的值设置为一个对象
newobj[key] = {};
// 如果里面还有一个对象呢?是否需要再写一个for in遍历呢?那如果里面还有一个呢如果还有还有一个呢
//这个clone函数做的就是遍历对象的工作
// 调用函数
clone()
}
//为什么不能先判断是否为object 因为数组也是属于对象 Object内置构造函数属于所有构造函数的老大
// ===========================
// if (oldobj[key] instanceof Object) {
// // obj2对象中必须将属性的值设置为一个对象
// newobj[key] = {};
// // 如果里面还有一个对象呢?是否需要再写一个for in遍历呢?那如果里面还有一个呢如果还有还有一个呢
// //这个clone函数做的就是遍历对象的工作
// // 调用函数
// clone()
// }else if(oldobj[key] instanceof Array){
// newobj[key] = [];
// clone(newobj[key]= oldobj[key])
// }
// ===========================
}
}
clone(obj2,obj1)
//打印拷贝后的值
console.log(obj2);
// 为什么newobj[key]是键oldobj[key]是值呢?
// let key = 'name';
// obj2[key] = 123
// console.log('obj2')
</script>
</body>
</html>
递归函数实现深拷贝
最新推荐文章于 2024-03-04 17:12:46 发布