深拷贝与浅拷贝
简单点:
b拷贝a,修改a,此时a发生变化,若b也跟着发生变化(脱离不了a的摆布),则为浅拷贝。若b不发生变化,能脱离a的摆布则为深拷贝。**
主要从基本数据类型和引用数据类型的概念说:
基本数据类型:number,string,boolean,null,undefined五类。
引用数据类型(Object类)有:对象{a:1},数组[1,2,3],以及函数等。
1、基本数据类型—名、值储存在栈内存中:例 let a =1
深拷贝:当你b=a复制时,栈内存会新开辟一个内存,例如这样:
浅显理解: let a = 1; let b = a ; 此时修改a=0;b不会发生变化。
真正意义上这不是深拷贝,因为深拷贝本身只针对较为复杂的object类型数据。
2、B.引用数据类型-- 名字存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值,例如:
浅拷贝: 当b=a进行拷贝时,其实b复制的只是a的引用地址,而并非堆里面值。例:
理解:此时我们去修改a的值,b同时也发生了变化,则为浅拷贝。
实现拷贝的方法
1、通过js的json实现
例:
<script>
var obj = {
name: '小甜甜',
age: 24,
say() {
console.log(11)
},
}
var obj1 = JSON.stringify(obj)
obj1 = JSON.parse(obj1)
console.log(obj1)
</script>
2、通过for in 遍历实现
例:
<script>
var obj = {
name: '小甜甜',
age: 24,
say() {
console.log(11)
},
}
var obj1 = {
}
for (var attr in obj) {
obj1[attr] = obj[attr]
}
console.log(obj1)
// 修改obj1
obj1.name = 'sx'
// 打印obj 不发生变化
console.log(obj)
</script>
3、使用Object.assign()方法
例:
<script>
var obj = {
name: '小甜甜',
age: 24,
say() {
console.log(11)
},
var obj1 = {
}
Object.assign(obj1, obj)
// 此处将两个对象合并
console.log(obj1)
</script>
4、 …(三个点)语法
例:
<script>
var obj = {
name: 'sx',
age: 18,
}
var obj1 = {
...obj }
// 修改obj的属性name
obj.name = 'ls'
//打印
console.log(obj, obj1)
</script>