js深拷贝递归实现
方法一:深拷贝递归调用
1 var obj = { 2 name:"John", 3 gender:{ 4 a:'男', 5 b:'女' 6 }, 7 fn:function(){}, 8 friends:[1,2,3,[25,35]] 9 } 10 11 12 function copy(obj){ 13 let newobj = null; //声明一个变量用来储存拷贝之后的内容 14 15 //判断数据类型是否是复杂类型,如果是则调用自己,再次循环,如果不是,直接赋值即可, 16 //由于null不可以循环但类型又是object,所以这个需要对null进行判断 17 if(typeof(obj) == 'object' && obj !== null){ 18 19 //声明一个变量用以储存拷贝出来的值,根据参数的具体数据类型声明不同的类型来储存 20 newobj = obj instanceof Array? [] : {}; 21 22 //循环obj 中的每一项,如果里面还有复杂数据类型,则直接利用递归再次调用copy函数 23 for(var i in obj){ 24 newobj[i] = copy(obj[i]) 25 } 26 }else{ 27 newobj = obj 28 } 29 console.log('77',newobj) 30 return newobj; //函数必须有返回值,否则结构为undefined 31 } 32 33 let obj2 = copy(obj); 34 obj2.name = 'peter'; 35 obj2.gender.a = 'shi'; 36 console.log(obj); 37 console.log(obj2);
方法二: 递归处理引用类型,数组
1 function deepCopy(target) { 2 if (typeof target === 'object') { 3 const newTarget = Array.isArray(target) ? [] : Object.create(null) 4 for (const key in target) { 5 newTarget[key] = deepCopy(target[key]) 6 } 7 return newTarget 8 } else { 9 return target 10 } 11 }
方法三:哈希表 Map 循环 引用,Map 支持引用类型数据作为键
1 function deepCopy(target, h = new Map) { 2 if (typeof target === 'object') { 3 if (h.has(target)) return h.get(target) 4 const newTarget = Array.isArray(target) ? [] : Object.create(null) 5 for (const key in target) { 6 newTarget[key] = deepCopy(target[key], h) 7 } 8 h.set(target, newTarget) 9 return newTarget 10 } else { 11 return target 12 } 13 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通