深拷贝的三种实现方式

在编程语言中,拷贝是一个基本的操作。当我们需要在代码中创建一个新的对象,而这个对象和原对象具有相同的属性和值时,我们就会用到拷贝操作。一般来说,拷贝分为两种类型:浅拷贝和深拷贝。其中深拷贝是一种比较常见的操作,它可以用来完整地复制一个对象,包括对象的所有属性和方法。本文将对深拷贝的三种实现方式进行详细的阐述,分别是 js, c#深拷贝的三种实现方式、深拷贝的三种实现方式的优缺点、深拷贝的三种实现方式 es6、深拷贝的三种实现方式 promise、list深拷贝的三种实现方式、浅拷贝的三种实现方式、深拷贝的完整实现、前端实现深拷贝的方式、js深拷贝的三种实现方式。

一、js, c#深拷贝的三种实现方式

在 js 和 c# 中,深拷贝通常有三种实现方式:递归拷贝、序列化/反序列化和 jQuery 的 extend 方法。

1.递归拷贝

递归拷贝是 js 和 c# 中实现深拷贝最基本的方法。它的基本思路是遍历原对象中的所有属性,然后分别将对应属性的值复制到新对象中。当属性的值还是一个对象时,递归调用自身进行拷贝。这种方法的优点是实现简单,可以适用于大多数数据类型。但是,如果拷贝的数据层数过多,则容易导致栈溢出的问题。

2.序列化/反序列化

在 js 中,可以通过 JSON 对象提供的 stringify 和 parse 方法来实现深拷贝。它的基本思路是将原对象转换成 JSON 字符串,然后再将 JSON 字符串转换成新对象。这种方法的优点是实现简单,可以支持所有的基本数据类型,同时也支持自定义对象。但是,它无法支持函数、正则表达式、日期等特殊数据类型,并且当数据量较大时,执行效率会变得较低。

3.jQuery 的 extend 方法

在 jQuery 中,有一个 extend 方法可以用来实现深拷贝。它的基本思路是遍历原对象中的所有属性,然后分别将对应属性的值复制到新对象中。当属性的值还是一个对象时,递归调用自身进行拷贝。这种方法的优点是实现简单,可以适用于大多数数据类型,同时还支持对数组的拷贝。

二、深拷贝的三种实现方式的优缺点

既然有多种方式可以实现深拷贝,那么这些方式各有何优缺点呢?

1.递归拷贝的优缺点

优点:

– 实现简单易懂,容易上手;
– 可以适用于多种数据类型;
– 可以保留原数据的结构和类型。

缺点:

– 如果数据层数过多,容易导致栈溢出;
– 在拷贝复杂数据结构时,执行效率较低。

2.序列化/反序列化的优缺点

优点:

– 实现简单易读;
– 可以适用于多种数据类型;
– 可以保留原数据的结构和类型。

缺点:

– 无法支持所有特殊数据类型;
– 在拷贝复杂数据结构时,执行效率较低。

3.jQuery 的 extend 方法的优缺点

优点:

– 实现简单易读;
– 可以适用于多种数据类型;
– 支持对数组的拷贝。

缺点:

– 无法支持所有特殊数据类型;
– 在拷贝复杂数据结构时,执行效率较低。

三、深拷贝的三种实现方式 es6

在 es6 中,可以通过使用 Object.assign 或者 spread 运算符来实现深拷贝。这两种方式的基本思路都是将原对象中的所有属性都复制到新对象中,同时当属性值是一个对象时,递归调用自身进行拷贝。具体实现方式可以参考下面的示例代码。


//使用Object.assign方式实现深拷贝
let obj1 = {a: 1, b: {c: 2}};
let obj2 = Object.assign({}, obj1);
console.log(obj2); //{a: 1, b: {c: 2}}
obj1.b.c = 3;
console.log(obj2); //{a: 1, b: {c: 2}}

//使用spread方式实现深拷贝
let arr1 = [1, 2, {a: 3}];
let arr2 = [...arr1];
console.log(arr2); //[1, 2, {a: 3}]
arr1[2].a = 4;
console.log(arr2); //[1, 2, {a: 3}]

四、深拷贝的三种实现方式 promise

在 promise 中,可以通过使用 Promise.resolve().then(JSON.parse(JSON.stringify())) 来实现深拷贝。这个方法的基本思路是将原对象转换成 JSON 字符串,然后再将 JSON 字符串转换成新对象。这种方法的优点是实现简单,可以支持所有的基本数据类型,同时也支持自定义对象。但是,它无法支持函数、正则表达式、日期等特殊数据类型,并且当数据量较大时,执行效率会变得较低。

五、list深拷贝的三种实现方式

在 list 中,深拷贝通常有三种实现方式:遍历拷贝、列表推导式和 copy 模块。

1.遍历拷贝

遍历拷贝是 list 中实现深拷贝最基本的方法。它的基本思路是遍历原列表中的所有元素,然后分别将对应元素的值复制到新列表中。当元素的值还是一个列表时,递归调用自身进行拷贝。这种方法的优点是实现简单,可以适用于大多数数据类型。但是,如果拷贝的数据层数过多,则容易导致栈溢出的问题。

2.列表推导式

在 list 中,可以通过使用列表推导式语法来实现深拷贝。它的基本思路是遍历原列表中的所有元素,然后分别将对应元素的值复制到新列表中。当元素的值还是一个列表时,递归调用自身进行拷贝。具体实现方式可以参考下面的示例代码。


#使用列表推导式方式实现深拷贝
import copy

lst1 = [1, 2, [3, 4]]
lst2 = [copy.deepcopy(x) for x in lst1]
print(lst2)    #[1, 2, [3, 4]]
lst1[2][0] = 5
print(lst2)    #[1, 2, [3, 4]]

3.copy 模块

在 list 中,还可以使用 copy 模块提供的 deepcopy 方法来实现深拷贝。它的基本思路和列表推导式相似,也是遍历原列表中的所有元素进行拷贝。但是,它的执行效率比其他方法都要快,并且它可以支持复杂数据结构。具体实现方式可以参考下面的示例代码。


#使用copy方式实现深拷贝
import copy

lst1 = [1, 2, [3, 4]]
lst2 = copy.deepcopy(lst1)
print(lst2)    #[1, 2, [3, 4]]
lst1[2][0] = 5
print(lst2)    #[1, 2, [3, 4]]

六、浅拷贝的三种实现方式

浅拷贝是一种简单的拷贝方式,只会复制对象的引用,而不会复制对象本身。在 js 中,可以通过使用 Object.assign 或者 … 运算符来实现浅拷贝。在 python 中,可以通过使用 copy 模块提供的 copy 方法来实现浅拷贝。在 c# 中,可以通过使用 Clone 方法来实现浅拷贝。

七、深拷贝的完整实现

在实现深拷贝时,我们可以将多种方法结合起来,以实现更完整的拷贝。例如,在 js 中,我们可以将递归拷贝与序列化/反序列化方法结合起来,以拓展拷贝能力。具体示例代码如下:


//深拷贝
function deepCopy(obj) {
    let str = JSON.stringify(obj);
    let result = JSON.parse(str);
    return result;
}

//原始数据
let obj1 = {a: 1, b: {c: 2}};
let obj2 = deepCopy(obj1);

//修改原始数据
obj1.b.c = 3;
console.log(obj2); //{a:1, b:{c:2}}

八、前端实现深拷贝的方式

在前端开发中,我们通常会遇到需要实现深拷贝的情况,例如在组件间传递参数时。根据具体的开发需求,我们可以选择不同的深拷贝方式。在实践中,比较常见的深拷贝方式有以下几种:

1.递归拷贝

递归拷贝是实现深拷贝最基本的方法,它的实现方式在前面已经进行了详细讲解。

2.使用 JSON 序列化/反序列化

在前端中,使用 JSON 序列化/反序列化的方式可以快速地实现对基本数据类型和自定义对象的深拷贝。具体实现方式可以参考下面的示例代码。


let original = {a: 1, b: {c: 2}};
let target = JSON.parse(JSON.stringify(original));
original.b.c = 3;
console.log(target); //{a: 1, b: {c: 2}}

3.使用 lodash 库的 cloneDeep 方法

lodash 库是前端开发中比较常用的一个实用工具库,它提供了很多实用的函数和方法。在 lodash 中,提供了一个 cloneDeep 方法可以用于实现深拷贝。具体实现方式可以参考下面的示例代码。


import cloneDeep from 'lodash/cloneDeep';

let original = {a: 1, b: {c: 2}};
let target = cloneDeep(original);
original.b.c = 3;
console.log(target); //{a: 1, b: {c: 2}}

4.使用 jQuery 的 extend 方法

在 jQuery 中,有一个 extend 方法可以用来实现深拷贝。具体实现方式可以参考下面的示例代码。


let original = {a: 1, b: {c: 2}};
let target = $.extend(true, {}, original);
original.b.c = 3;
console.log(target); //{a: 1

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/185479.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-26 12:18
下一篇 2024-11-26 12:18

相关推荐

  • Vb运行程序的三种方法

    VB是一种非常实用的编程工具,它可以被用于开发各种不同的应用程序,从简单的计算器到更复杂的商业软件。在VB中,有许多不同的方法可以运行程序,包括编译器、发布程序以及命令行。在本文中…

    编程 2025-04-29
  • Python程序的三种基本控制结构

    控制结构是编程语言中非常重要的一部分,它们指导着程序如何在不同的情况下执行相应的指令。Python作为一种高级编程语言,也拥有三种基本的控制结构:顺序结构、选择结构和循环结构。 一…

    编程 2025-04-29
  • Python缓存图片的处理方式

    本文将从多个方面详细阐述Python缓存图片的处理方式,包括缓存原理、缓存框架、缓存策略、缓存更新和缓存清除等方面。 一、缓存原理 缓存是一种提高应用程序性能的技术,在网络应用中流…

    编程 2025-04-29
  • Python三种基本输入元素

    本文将从多个方面对于Python三种基本输入元素进行详细的阐述并给出代码示例。 一、Python三种基本输入元素解答 Python三种基本输入元素包括命令行参数、标准输入和文件输入…

    编程 2025-04-28
  • Python在线编辑器的优势与实现方式

    Python在线编辑器是Python语言爱好者的重要工具之一,它可以让用户方便快捷的在线编码、调试和分享代码,无需在本地安装Python环境。本文将从多个方面对Python在线编辑…

    编程 2025-04-28
  • Java表单提交方式

    Java表单提交有两种方式,分别是get和post。下面我们将从以下几个方面详细阐述这两种方式。 一、get方式 1、什么是get方式 在get方式下,表单的数据会以查询字符串的形…

    编程 2025-04-27
  • 用Pythonic的方式编写高效代码

    Pythonic是一种编程哲学,它强调Python编程风格的简单、清晰、优雅和明确。Python应该描述为一种语言而不是一种编程语言。Pythonic的编程方式不仅可以使我们在编码…

    编程 2025-04-27
  • Java多版本支持实现方式

    本文将从以下几个方面阐述如何实现Java多版本支持,并给出可行的代码示例。 一、多版本Java环境概述 Java是一门跨平台的编程语言,但是在不同的应用场景下,可能需要使用不同版本…

    编程 2025-04-27
  • SpringBoot Get方式请求传参用法介绍

    本文将从以下多个方面对SpringBoot Get方式请求传参做详细的阐述,包括URL传参、路径传参、请求头传参、请求体传参等,帮助读者更加深入地了解Get请求方式下传参的相关知识…

    编程 2025-04-27
  • Python获取APP数据的多种方式

    如果您需要对APP进行分析、数据采集、监控或者自动化测试,那么您一定需要获取APP的数据。本文将会介绍一些Python获取APP数据的方式。 一、使用ADB工具获取APP数据 AD…

    编程 2025-04-27

发表回复

登录后才能评论