obj.a = obj; 这种情况如果不进行处理, 就会无限循环下去,栈溢出.
版本1.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function clone (origin, target) {
var target = target || {};
var objStr = Object.prototype.toString;
for(var key in origin) {
if (origin.hasOwnProperty(key) && origin[key] !== null) {
if(origin == origin[key]){// 防止自循环
target[key] = target;
}else if (objStr.call(origin[key]) == "[object Object]") {
target[key] = {};
console.log(target == origin[key]);
clone(origin[key],target[key]);
} else if (objStr.call(origin[key]) == "[object Array]"){
target[key] = [];
clone(origin[key],target[key]);
} else {
target[key] = origin[key];
}
}
}
return target;
}
版本一不能解决 obj.a.b.c = obj; 版本二 用一个数组,进行辅助筛选 但性能估计会差很多. 下面的结构没有优化, 先凑合记录一下
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
function clone (origin, target,arr) {
var target = target || {};
var objStr = Object.prototype.toString;
// 思路是, 所有 obj, arr 都放进一个数组.
// 每次,我们都遍历一下. 如果相同就 continue 跳过去
// 如果一个都不同, 就 push进去.
var arr = arr || [origin];
for(var key in origin) {
if (origin.hasOwnProperty(key) && origin[key] !== null) {
if (objStr.call(origin[key]) == "[object Object]") {
if (arr.indexOf(origin[key]) != -1) {
continue;
}else{
arr.push(origin[key]);
console.log(arr);
}
target[key] = {};
clone(origin[key],target[key],arr);
} else if (objStr.call(origin[key]) == "[object Array]"){
if (arr.indexOf(origin[key]) != -1) {
continue;
}else{
arr.push(origin[key]);
}
target[key] = [];
clone(origin[key],target[key]);
} else {
target[key] = origin[key];
}
}
}
return target;
}
深度复制对象已解决循环引用
看到有一个用es6的, 有点没看懂,先记录一下
