深/浅拷贝,有哪些实现方式

简介: 深/浅拷贝,有哪些实现方式

深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种常见的数据复制操作,它们在复制对象或数组时的行为不同。

深拷贝是创建一个新的独立对象,并递归地复制原始对象及其所有嵌套的对象和属性。深拷贝得到的是完全独立的副本,对副本的修改不会影响原始对象。

浅拷贝是创建一个新的对象,但是仅复制原始对象的引用,而不复制嵌套对象本身。这意味着原始对象和副本共享相同的嵌套对象,对副本或原始对象的修改可能会相互影响。

以下是几种实现深拷贝和浅拷贝的方式:

实现深拷贝的方式:

  1. 递归复制:递归遍历对象或数组的属性,并创建新的对象或数组来复制每个属性。可以使用递归函数或库(如lodash的cloneDeep)来实现。

  2. JSON序列化和反序列化:使用JSON.stringify将对象转换为字符串,然后使用JSON.parse将字符串转换回对象。这种方法可以实现简单对象的深拷贝,但对于包含函数、正则表达式等特殊类型的对象可能会丢失信息。

  3. 使用第三方库:许多JavaScript库(如lodash、jQuery等)提供了深拷贝函数,可以方便地实现深拷贝操作。

实现浅拷贝的方式:

  1. Object.assign():使用Object.assign(target, source)将源对象的属性复制到目标对象中。这是一种浅拷贝方式,如果属性值是对象或数组,仍然是浅拷贝。

  2. 扩展运算符(...):使用扩展运算符(...)可以快速创建一个浅拷贝的新对象。例如,使用const copy = { ...original }可以复制原始对象的属性到新对象中。

  3. 数组的slice()和concat()方法:对于数组,可以使用slice()方法或concat()方法创建一个新的数组,并复制原始数组的元素。这也是浅拷贝的方式,对于嵌套数组或对象仍然是浅拷贝。

需要注意的是,以上方式都是通用的实现方式,但对于特殊的对象类型(如Date对象、Map、Set等),可能需要针对性地实现深拷贝或浅拷贝操作。此外,某些情况下,可能需要结合不同的方式来实现复杂对象的拷贝操作。

相关文章
|
2月前
|
JSON JavaScript 前端开发
怎么做深拷贝?
怎么做深拷贝?
|
2月前
|
编译器 C++ Python
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
【C/C++ 泡沫精选面试题02】深拷贝和浅拷贝之间的区别?
62 1
|
2月前
|
JSON 前端开发 JavaScript
面试官:请你说下深、浅拷贝并且手写深、浅拷贝,我:你咋知道我只会这个?
面试官:请你说下深、浅拷贝并且手写深、浅拷贝,我:你咋知道我只会这个?
|
1月前
|
存储 编译器 C++
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
20 0
|
8月前
|
JavaScript
一文弄懂浅拷贝和深拷贝
一文弄懂浅拷贝和深拷贝
34 0
|
人工智能 JavaScript 前端开发
为什么要用深浅拷贝、什么是深浅拷贝、以及如何实现
首先我们要明白一点,js中数据类型分为: 基本数据类型 (Number, String, Boolean, Null, Undefined, Symbol) 对象数据类型 ( Object )** 引用数据类型的值是保存在栈内存和堆内存中的对象。栈区内存保存变量标识符和指向堆内存中该对象的指针。当寻找引用值时,解释器会先寻找栈中的地址。然后根据地址找到堆内存的实体
80 0
为什么要用深浅拷贝、什么是深浅拷贝、以及如何实现
|
Web App开发 JSON JavaScript
【面试官系列】请讲讲你知道的关于对象和数组深、浅拷贝的一些技巧 ~(二)
【面试官系列】请讲讲你知道的关于对象和数组深、浅拷贝的一些技巧 ~(二)
|
JSON JavaScript 前端开发
【面试官系列】请讲讲你知道的关于对象和数组深、浅拷贝的一些技巧 ~(一)
【面试官系列】请讲讲你知道的关于对象和数组深、浅拷贝的一些技巧 ~(一)
|
存储 JSON 缓存
前端面试:浅拷贝和深拷贝的区别?
前端面试:浅拷贝和深拷贝的区别?
101 0
|
前端开发
前端学习案例10-深拷贝和浅拷贝
前端学习案例10-深拷贝和浅拷贝
60 0
前端学习案例10-深拷贝和浅拷贝