1.通过递归实现深拷贝函数
function deepClone(obj) {
if(typeof obj != 'object' || obj == null) {
return obj
}
let result
if(obj instanceof Array) {
result = []
}else{
result = {}
}
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key])
}
}
return result
}
1.递归终止条件就是如果当前对象不是复杂数据类型或者为空,那么就不需要继续递归了,可以直接返回obj。
2.深拷贝函数返回的是一个新的对象或者数组,我们可以先判断这个对象是数组类型还是对象类型,这里得先判断是不是数组类型,因为数组本质上也是对象。
3.遍历这个obj,对象只能用for...in遍历,然后通过hasOwnProperty()判断这个属性是否是obj对象本身的,如果是原型对象上的话我们就不复制。
4.最后返回这个对象,就是深拷贝复制出来的对象。
const obj1 = {
a:1,
b:2,
c:[1,2,3],
d:{
e:{
g:5
}
},
f:function() {
return 1
},
}
console.log(deepClone(obj1));
//打印结果如下
{ a: 1, b: 2, c: [ 1, 2, 3 ], d: { e: { g: 5 } }, f: [Function: f] }
2.JSON实现深拷贝
function JSONClone(obj) {
let result = JSON.stringify(obj)
let objClone = JSON.parse(result)
return objClone
}
通过JSON实现深拷贝的无法实现对对象中方法的深拷贝。
JSON.stringify将对象转换为JSON格式,JSON.parse将JSON格式转换为对象。
console.log(JSONClone(obj1))
//打印结果如下
{ a: 1, b: 2, c: [ 1, 2, 3 ], d: { e: { g: 5 } } }
可以看到函数方法没有被打印出来