首先深复制和浅复制都是针对Object、Array这类的复杂对象,对于一般的string、int、boolean等数据不存在深复制浅复制。
浅复制
是对对象地址的复制,并没有开辟新的栈,复制的结果是两个对像指向同一个地址,修改一个对象的属性另一个对象也会改变。
let china = {
nation: '中国',
birthplaces: ['北京', '上海', '广州'],
color: 'pink',
friends: ['Jenny', 'Tina']
}
let newChina = china
newChina.color = 'white'
console.log(china)
console.log(newChina)
结果:
深复制
深复制则是开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性
let china = {
nation: '中国',
birthplaces: ['北京', '上海', '广州'],
color: 'pink',
friends: ['Jenny', 'Tina']
}
let newChina = deepCopy(china)
newChina.color = 'white'
console.log(china)
console.log(newChina)
function deepCopy (obj) {
let newObj = obj.constructor === Array ? [] : {}
if (typeof obj !== 'object') {
return
} else if (window.JSON) { // 一种深拷贝最简单的方法
let str = JSON.stringify(obj)
newObj = JSON.parse(str)
} else { // 深拷贝最经典的方法
for (let o in obj) {
newObj[o] = typeof obj[o] === 'object' ? deepCopy(obj[o]) : obj[o]
}
}
return newObj
}
上面是两种深拷贝的方法,第一种用JSON的两个方法进行转换,第二种使用递归调用。