// 方法1 Object.getOwnPropertyDescriptors() 方法用来获取一个对象的所有自身属性的描述符。返回所指定对象的所有自身属性的描述符,如果没有任何自身属性,则返回空对象。// 这样做的好处就是能够提前定义好最后返回的数据类型。functiondeepClone(obj){let res =null;const reference =[Date, RegExp, Set, WeakSet, Map, WeakMap, Error];if(reference.includes(obj?.constructor)){
res =newobj.constructor(obj);}elseif(Array.isArray(obj)){
res =[];
obj.forEach((e, i)=>{
res[i]=deepClone(e);});}elseif(typeof obj ==="Object"&& obj !==null){
res ={};for(const key in obj){if(Object.hasOwnProperty.call(obj, key)){
res[key]=deepClone(obj[key]);}}}else{
res = obj;}return res;}// 方法2: 用hash来存储已经加载过的对象,如果已经存在的对象,就直接返回。functiondeepClone(obj, hash =newWeakMap()){if(hash.has(obj)){return obj;}let res =null;const reference =[Date, RegExp, Set, WeakSet, Map, WeakMap, Error];if(reference.includes(obj?.constructor)){
res =newobj.constructor(obj);}elseif(Array.isArray(obj)){
res =[];
obj.forEach((e, i)=>{
res[i]=deepClone(e);});}elseif(typeof obj ==="Object"&& obj !==null){
res ={};for(const key in obj){if(Object.hasOwnProperty.call(obj, key)){
res[key]=deepClone(obj[key]);}}}else{
res = obj;}
hash.set(obj, res);return res;}// 方法3: iview 方案functiondeepCopy(data){const t =typeOf(data);let o;if(t ==='array'){
o =[];}elseif( t ==='object'){
o ={};}else{return data;}if(t ==='array'){for(let i =0; i < data.length; i++){
o.push(deepCopy(data[i]));}}elseif( t ==='object'){for(let i in data){
o[i]=deepCopy(data[i]);}}return o;}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
11. 生产随机字符
functionrandomStr(len =32){const $chars ='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';const maxPos = $chars.length;let str ='';for(let i =0; i < len; i++){
str += $chars.charAt(Math.floor(Math.random()* maxPos));}return str;}