我理解的深浅拷贝!!!
什么是深拷贝,什么是浅拷贝
首先我们要明白一点,js中数据类型分为:
基本数据类型 (Number, String, Boolean, Null, Undefined, Symbol)
对象数据类型 ( Object )
引用数据类型的值是保存在栈内存和堆内存中的对象。栈区内存保存变量标识符和指向堆内存中该对象的指针。当寻找引用值时,解释器会先寻找栈中的地址。然后根据地址找到堆内存的实体
浅拷贝:也就是拷贝A对象里面的数据,但是不拷贝A对象里面的子对象
深拷贝:会克隆出一个对象,数据相同,但是引用地址不同(就是拷贝A对象里面的数据,而且拷贝它里面的子对象)
现在用实例来说明:
浅拷贝: 是通过对象类方法 Object.assign() 和 ...运算符进行拷贝
咱们先看一下简单的变量赋值
let haha = {
name:'哈哈',
children:{
name:'呵呵'
}
}
let heihei = haha
heihei.name = '嘿嘿'
console.log(heihei , 'heihei' )
console.log(haha , 'haha' )
此时如果修改heihei的name属性 那么haha的name属性也会发生变化

接下来使用Object.assign()进行浅拷贝 看看会发生什么
let haha = {
name:'哈哈',
children:{
name:'呵呵'
}
}
let heihei = Object.assign({},haha)
heihei.name = '嘿嘿'
console.log(heihei , 'heihei' )
console.log(haha , 'haha' )
这个时候我们改变一下 heihei 的name属性 会发现haha的 name属性不会发生变化

但是修改heihei的children属性内部的name的话 会发现haha children属性内部的name也会跟着发生变化
let haha = {
name:'哈哈',
children:{
name:'儿子'
}
}
let heihei = Object.assign({},haha)
heihei.name='嘿嘿'
heihei.children.name='女儿'
console.log(haha , 'haha')
console.log(heihei , 'heihei' )
这就是因为 haiWang 拷贝haoTian对象里面的数据,但是不拷贝haoTian对象里面的子对象
深拷贝: 通过JSON.parse(JSON.stringify())方法进行拷贝
let haha = {
name:'哈哈',
children:{
name:'儿子'
}
}
let heihei = JSON.parse(JSON.stringify(haha))
heihei.name='嘿嘿'
heihei.children.name='呵呵'
console.log(haha, 'haha')
console.log(heihei , 'heihei' )

浙公网安备 33010602011771号