1. 定义
深拷贝:针对属性值是引用类型,会再次遍历每个属性,将属性复制过来,是一个递归的过程,会开辟新的堆内存,两者完全分离。
浅拷贝:针对属性值是引用类型,会直接将引用复制过来,这样我们无论在新旧数组进行了修改,两者都会发生变化。
2. 利用原生方法实现
2.1 浅拷贝
let newArr = array.concat()
let newArr = array.slice()
let newArr = array.splice(0)
let newArr = [...array]
2.2 深拷贝
let newArr = JSON.parse(JSON.stringify(array))
3. 自定义实现
3.1 浅拷贝
function shadowCopy(obj) {
if(typeof obj !== 'object') {
return
}
let ret = obj instanceof Array? [] : {}
for(key in obj) {
if(obj.hasOwnProperty(key)) {
ret[key] = obj[key]
}
}
return ret
}
3.2 深拷贝
function deepCopy(obj) {
if(typeof obj !== 'object') {
return
}
let ret = obj instanceof Array? [] : {}
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
ret[key] = typeof obj[key] === 'object' && obj[key] !== null?
deepCopy(obj[key]) :
obj[key]
}
}
return ret
}