递归拷贝,可以单独封装到工具包里,直接调用
递归深拷贝方法
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
忍一时,越想越气;
退一步,哎呦我去!