基本类型 string boolean number等
基本类型存储在栈内存中
基本类型的数据在拷贝时候相当于把值也一并复制给了新的变量,在栈中开辟了一个新的变量,两个变量互不影响
let a = 1;
let b = a;
b = 5
console.log(a); //1
console.log(b); //5
引用类型 Array,Object,Function等
引用类型存储在堆内存中,但是在栈内存中存储他指向堆内存地址的引用
也就是说只要堆内存地址是一样的,引用类型修改内部的值以后会影响所有指向该地址的引用类型对象
const obj = {
name: "杨昆",
age: 25,
}
//浅拷贝
const objCopy = obj;
objCopy.name = "杨坤";
console.log(objCopy)
console.log(obj)
上面截图可知,obj对象已经在堆内存中开辟了一个地址,栈内存中有一个指向该对象堆地址的对象,这时候直接赋值给objCopy对象,就是相当于在栈内存中有新开辟一个地址指向栈内存中同一个对象,大家指向同一个对象,所以当修改任意一个对象内部的值,所有引用该对象栈地址的对象都会跟着变,这也就是所谓的浅拷贝,
深拷贝可以理解为结构和数值一样的对象,但是在堆内存中是不一样的地址,大家没有任何关联,只是长得像而已,接下来把上面的对象深拷贝再改一下内部的值,顺便再列举几个深拷贝的方法
const obj = {
name: "杨昆",
age: 25,
}
console.log(obj)
//深拷贝方法1
const objCopyDeep1 = { ...obj };
//深拷贝方法2
const objCopyDeep2 = JSON.parse(JSON.stringify(obj));
objCopyDeep1.name = "五月天";
objCopyDeep2.name = "beyond";
console.log(objCopyDeep1)
console.log(objCopyDeep2)
深拷贝以后,修改自己内部的值,不会影响其他对象,因为这时候在堆内存中已经开辟了这三个对象的地址,各自独立