一、浅拷贝
首先深浅拷贝只针对引用类型
浅拷贝:拷贝的是地址
常见方法:
1.拷贝对象:Object.assgin()/展开运算符{...obj}拷贝对象
2.拷贝数组:Array.prototype.concat()或者【...arr】
问题:如果简单数据类型拷贝的是值,引用数据类型拷贝的是地址
<script>
const obj={
name:'oo',
age:18
}
//方法一 浅拷贝
const o={...obj}
console.log(o)
//方法二
const b={}
Object.assign(b,obj)
console.log(b)
</script>
二、深拷贝
深拷贝:拷贝的是对象,不是地址
常见方法:
1.通过函数递归实现深拷贝(遇到数组、对象在使用递归,先array在数组)
2.lodash/cloneDeep
3.通过JSON.stringify()实现
三、递归实现深拷贝
函数递归:如果一个函数在内部可以调用其本身,那么这个函数就是递归函数
简单理解:函数内部自己调用自己,这个函数就是递归函数
由于递归函数容易发送“栈溢出”错误,所以必须要加退出条件return
<script>
const obj = {
uname: 'pink',
age: '18',
hobby:['乒乓球','足球'],
family:{
baby:'小'
}
}
const o = {}
//拷贝
function deepCopy(newObj, oldObj) {
for (let k in oldObj) {
//处理数组问题
if(oldObj[k] instanceof Array){
newObj[k]=[]
//newObj[k] 接受 []
//oldObj[k] ['乒乓球','足球']
deepCopy(newObj[k],oldObj[k])
}
//处理集合问题
else if(oldObj[k] instanceof Object){
newObj[k]={}
deepCopy(newObj[k],oldObj[k])
}
else{
//k 属性名 oldObj[k] 属性值 18
//newObj[k] === o.uname
newObj[k] = oldObj[k]
}
}
}
deepCopy(o, obj) //函数调用 两个参数 o是新对象 obj旧对象
console.log(o)
o.hobby[0]='篮球'
o.age = 20
o.family.baby='老pink'
console.log(obj); //无影响
</script>
四、js库lodash里面cloneDeep内部实现了深拷贝
<!-- 先引用 -->
<script src="./lodash.min.js"></script>
<script>
const obj={
uname:'pink',
age:'18',
hobby:['乒乓球','足球'],
family:{
baby:'小pink'
}
}
const o=_.cloneDeep(obj)
</script>
五、JSON.stringify() 字符串转换
<script>
const obj={
uname:'pink',
age:'18',
hobby:['乒乓球','足球'],
family:{
baby:'小pink'
}
}
//把对象转换为JSON字符串
console.log(JSON.stringify(obj))
//字符串转换成对象
const o=JSON.parse(JSON.stringify(obj))
console.log(o)
</script>