小工具知识网

当前位置: 首页 > 行业知识 > js 深拷贝和浅拷贝

行业知识

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 进行不同修改所产生的影响。

    执行结果

    总结

    浅拷贝堆上数据会共享,栈上数据不共享

    深拷贝后的对象和原对象是两个不同的对象,所有数据不共享。

上一篇:服务器项目竞标公告怎么写?

下一篇:轻松下载建经软件,详细指南助你轻松上手!