行业知识
js 深拷贝和浅拷贝
2026-11-07 10:10:09
来源:互联网转载
例子
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 进行不同修改所产生的影响。
执行结果
总结
浅拷贝堆上数据会共享,栈上数据不共享
深拷贝后的对象和原对象是两个不同的对象,所有数据不共享。
上一篇:服务器项目竞标公告怎么写?