浅克隆
浅克隆可以把源对象上的数据复制到目标对象上去,对于源对象上简单数据类型可以完全复制,对于源对象上的复杂数据类型则复制的是引用地址,修改目标对象则源对象也会变
浅克隆可以用Object.assign(target,obj)方法来实现,可以把obj对象上的属性复制到target对象上
下面来实现手写浅克隆:
function myassign(obj1,obj2) {
if(!(obj1 instanceof Object) || !(obj2 instanceof Object)) throw(new Error('参数必须是对象'))
for(var key in obj2) {
obj1[key] = obj2[key]
}
return obj1
}
深克隆
深克隆是把源对象完全克隆到目标对象上,改变目标对象也不会影响到源对象
下面是手写的深度克隆函数:
function deepClone(target,obj) {
if(!(target instanceof Object) || !(obj instanceof Object)) throw(new Error('参数必须是对象'))
for(var key in obj) {
if(obj[key] instanceof Object) {
let result = obj[key] instanceof Array ? [] : {}
target[key] = deepClone(result,obj[key])
}else {
target[key] = obj[key]
}
}
return target
}
函数实现: 先判断参数是否是对象,然后根据循环判断源对象上的属性是简单数据类型还是复杂数据类型,简单类型直接复制,复杂数据类型利用递归调用的方式,对属性值接着遍历复制,直到完全克隆。