递归拷贝,可以单独封装到工具包里,直接调用

递归深拷贝方法

 1             
 2             // 拷贝对象
 3             // 从原型上判断这个对象的类型是什么
 4             function checkType(Obj) {
 5               return Object.prototype.toString.call(Obj).slice(8, -1)
 6             } 
 7             // 不同的对象调用不同的拷贝方式
 8             const cloneFn = (Obj) => {
 9                 if(checkType(Obj) === 'Object') {                                             // 拷贝对象
10                     let o = {};
11                     for(let key in Obj) {
12                       o[key] = cloneFn(Obj[key])
13                     }
14                     return o;
15                   } else if(checkType(Obj) === 'Array') {                                     // 拷贝数组
16                     var arr = []
17                     for(let i = 0,leng = Obj.length;i<leng;i++) {
18                       arr[i] = cloneFn(Obj[i])
19                     }
20                     return arr;
21                   } else if(checkType(Obj) === 'Function') {                                 // 拷贝函数
22                     return new Function('return '+Obj.toString()).call(this)
23                   } else if(checkType(Obj) === 'Date') {                                     // 拷贝日期
24                     return new Date(Obj.valueOf())
25                   } else if(checkType(Obj) === 'RegExp') {                                     // 拷贝正则
26                     return new RegExp(Obj)
27                   } else if(checkType(Obj) === 'Map') {                                         // 拷贝Map 集合
28                     let m = new Map()
29                     Obj.forEach((v,k)=>{
30                       m.set(k, cloneFn(v))
31                     })
32                     return m
33                   } else if(checkType(Obj) === 'Set') {                                         // 拷贝Set 集合
34                     let s = new Set()
35                     for(let val of Obj.values()) {
36                       s.add(cloneFn(val))
37                     }
38                     return s
39                   }
40                   return Obj; 
41             }
42             console.log(cloneFn({name:'MM',age:19}))

 

 来源:       作者:Cpp程序员 https://www.bilibili.com/read/cv14520067/     出处:bilibili

posted @ 2022-08-06 13:25  伊人兮明眸秋水  阅读(24)  评论(0编辑  收藏  举报