深拷貝的三種實現方式

在編程語言中,拷貝是一個基本的操作。當我們需要在代碼中創建一個新的對象,而這個對象和原對象具有相同的屬性和值時,我們就會用到拷貝操作。一般來說,拷貝分為兩種類型:淺拷貝和深拷貝。其中深拷貝是一種比較常見的操作,它可以用來完整地複製一個對象,包括對象的所有屬性和方法。本文將對深拷貝的三種實現方式進行詳細的闡述,分別是 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/zh-hant/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

發表回復

登錄後才能評論