JavaScript算法系列[1]-克隆

对象深度克隆

考察知识点比较多,考到了对象遍历,对象类型判断,递归,以及普通对象操作的API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function deepClone (obj) {
// function赋值也是指针传递,只是由于function不可更改,所以浅复制后也不会对原对象造成影响

if(typeof obj !== "object") {
return obj; //原始类型以及函数类型,直接返回,相当于克隆
}
var o = isArray(obj) ? [] : {};
// 利用 for in 既可以遍历对象又可以遍历数组
for(i in obj) {
if(obj.hasOwnProperty(i)){
// 判断源对象obj的某属性是不是指向源对象自身(循环引用),
// 如果是,则不继续往下递归了(会栈溢出),就直接让新对象o的该属性也指向o自身就完了。
o[i] = (obj[i] === obj) ? o : deepClone(obj[i])
// 下面是没有解决循环引用问题的版本
// o[i] = deepClone(obj[i]);
// 下面是在这里处理function类型的版本
// o[i] = typeof obj[i] === "object" ? deepClone(obj[i]) : obj[i];
}
}
return o;
}