Repository navigation
Expand file tree
/
Copy pathdeep-clone.js
More file actions
79 lines (68 loc) · 1.72 KB
/
Copy pathdeep-clone.js
File metadata and controls
79 lines (68 loc) · 1.72 KB
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
75
76
77
78
79
let testObj = {
x: {
y: {
z:6
},
r: Symbol("Tom")
},
a: function(){
console.log("something")
},
b: undefined,
c: [1,3,6,3,6],
d: "we",
e: true,
f: {
g: "hello",
h: {
i: "world",
j:{
k:{
l: "test"
}
}
}
},
sub:{}
}
testObj.circle = testObj
testObj.sub.x = testObj.x
/* recursive way of deep clone */
function deepClone(obj) {
let map = new WeakMap();
function dc(obj){
if(obj instanceof Date){
return new Date(obj)
}
if(obj instanceof RegExp){
return new RegExp(obj)
}
// do a shallow clone of object
let newObj = Object.create(Object.getPrototypeOf(obj), Object.getOwnPropertyDescriptors(obj));
// check reference so it won't go into dc(clone) recursive again
let existedObj = map.get(obj)
if(existedObj){
return existedObj
}
map.set(obj, newObj)
let keys = Reflect.ownKeys(obj);
for(let i = 0; i < keys.length; i++){
let clone = obj[keys[i]]
if(isObject(clone) && typeof test !== 'function'){
newObj[keys[i]] = dc(clone)
}else{
newObj[keys[i]] = clone
}
}
return newObj
}
return dc(obj)
}
function isObject(test) {
return (typeof test === 'object' || typeof test === 'function' ) && test != null;
// return Object.prototype.toString.call(test) === '[object Object]'
}
let newTest = deepClone(testObj)
console.log(newTest.sub.x === newTest.x)
testObj.c[0] = 100
console.log(newTest)