js基本类型和引用类型的深浅拷贝

本文深入探讨JavaScript中的基本类型与引用类型的内存存储差异,以及在拷贝过程中产生的不同效果。通过示例解释了浅拷贝如何导致对象共享同一堆内存,而深拷贝则创建了独立的对象副本。文中还介绍了两种实现深拷贝的方法,并通过实际操作展示了深拷贝后修改对象值不会影响原始对象或另一个深拷贝对象的特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本类型 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)

深拷贝以后,修改自己内部的值,不会影响其他对象,因为这时候在堆内存中已经开辟了这三个对象的地址,各自独立

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值