自学内容网 自学内容网

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 不受影响,因为 ba 的栈存储数据是相互独立的。但是当修改 b 中的堆存储数据字段(例如 classNumbers.id)时,原始对象 a 也会受到影响,因为 ba 共享相同的堆存储数据。

  • 深拷贝:通过 JSON.parse(JSON.stringify(a)) 实现,创建了 c 对象。深拷贝会创建一个完全独立的对象,包括栈存储数据和堆存储数据,因此无论对 c 进行怎样的修改,都不会影响原始对象 a

因此,通过打印上述代码中输出的 JSON 字符串,可以看到对 abc 进行不同修改所产生的影响。

执行结果

总结

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

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


原文地址:https://blog.csdn.net/h1530687053/article/details/136444956

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!