js 深拷贝和浅拷贝
例子
const a = {
name: "rust",
age: 12,
classNumbers: {
id: 1
}
}
// 约等于浅拷贝操作
const b = {...a};
// 约等于深拷贝操作
const c = JSON.parse(JSON.stringify(a));
// 修改栈存储数据的字段
b.name = 'js';
console.log(JSON.stringify(a))
console.log(JSON.stringify(b))
// 修改堆存储数据的字段
b.classNumbers.id = 2;
console.log(JSON.stringify(a))
console.log(JSON.stringify(b))
// 修改堆存储数据的字段
c.classNumbers.name = 'changed';
console.log(JSON.stringify(a))
console.log(JSON.stringify(c))
解释
首先,我们定义了一个对象 a
,其中包含了一个名为 "rust" 的字符串、一个年龄为 12 的数字,以及一个内部对象 classNumbers
,包含了一个 id 为 1 的数字。接着,我们进行了浅拷贝和深拷贝操作,并对拷贝后的对象进行了一系列修改操作。
-
浅拷贝:通过
{...a}
实现,创建了b
对象。当修改b
中栈存储数据字段时(例如name
),原始对象a
不受影响,因为b
和a
的栈存储数据是相互独立的。但是当修改b
中的堆存储数据字段(例如classNumbers.id
)时,原始对象a
也会受到影响,因为b
和a
共享相同的堆存储数据。 -
深拷贝:通过
JSON.parse(JSON.stringify(a))
实现,创建了c
对象。深拷贝会创建一个完全独立的对象,包括栈存储数据和堆存储数据,因此无论对c
进行怎样的修改,都不会影响原始对象a
。
因此,通过打印上述代码中输出的 JSON 字符串,可以看到对 a
、b
和 c
进行不同修改所产生的影响。
执行结果
总结
浅拷贝堆上数据会共享,栈上数据不共享
深拷贝后的对象和原对象是两个不同的对象,所有数据不共享。
原文地址:https://blog.csdn.net/h1530687053/article/details/136444956
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!