ES6深拷貝的實現原理及應用場景

一、實現原理

1. 對象類型的深拷貝


function deepClone(source, map = new Map()) {
    if (source === null || typeof source !== "object") {
        return source;
    }
    if (map.get(source)) {
        return map.get(source);
    }
    let target = Array.isArray(source) ? [] : {};
    map.set(source, target);
    Object.keys(source).forEach(key => {
        if (source.hasOwnProperty(key)) {
            target[key] = deepClone(source[key], map);
        }
    });
    return target;
}

2. 基本數據類型的深拷貝


function deepClone(data) {
    return JSON.parse(JSON.stringify(data));
}

以上代碼中出現了一個新的概念:Map,它的用途是用來記錄已經拷貝過的對象,避免重複拷貝。

二、應用場景

1. 場景一:對象中的數據飽含了業務邏輯,需要對其進行深度拷貝。

例如,業務中有一個 order 對象,它包含了訂單信息、購物車信息等,這個對象的數據量很大,而且其中的對象結構非常複雜,如果使用淺拷貝,可能會只獲取到其中的部分數據,而導致業務出現問題。這時就需要使用深拷貝。

2. 場景二:函數中參數傳遞的時候,需要對複雜對象進行拷貝,避免原始對象被修改,影響其他業務邏輯。

假設在一個項目中,有一個函數需要接收一個對象作為參數,而這個對象可能被多個其他函數調用,如果這個對象是一個被掛載在全局變數上的單例對象,那麼很可能在調用函數的過程中被其他函數改變,從而導致程序失去控制。這時就可以在函數中使用深拷貝,每次將數據進行拷貝,避免了原始對象被修改的情況。

三、深拷貝的缺點和注意事項

1. 深拷貝會消耗大量的內存空間和運算時間,當數據量過大的時候,可能會導致性能問題。

2. 如果拷貝對象包含遞歸引用,例如 A 對象中的某個屬性引用了 A 對象本身,那麼拷貝函數會陷入無限遞歸的死循環,導致瀏覽器或者 Node.js 伺服器崩潰。

3. 對於一些不可拷貝的數據類型,例如函數、正則表達式、Promise 等,需要特殊處理。

四、總結

ES6中的深拷貝是基於遞歸和 Map 數據結構實現的,可以在複雜數據類型的業務場景中避免出現因為淺拷貝而導致的數據不完整或失真的情況。在實際應用中,需要根據業務情況來選擇使用深拷貝或淺拷貝,並且需要避免濫用深拷貝,以免導致性能問題。

原創文章,作者:WHUI,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/149073.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
WHUI的頭像WHUI
上一篇 2024-11-04 17:52
下一篇 2024-11-04 17:52

相關推薦

  • Unity3D 創建沒有 Terrain Tile 的場景

    這篇文章將會介紹如何在 Unity3D 中創建一個沒有 Terrain Tile 的場景,同時也讓讀者了解如何通過編程實現這個功能。 一、基礎概念 在 Unity3D 中,Terr…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 神經網路BP演算法原理

    本文將從多個方面對神經網路BP演算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP演算法簡介 BP演算法是一種常用的神經網路訓練演算法,其全稱為反向傳播演算法。BP演算法的基本思想是通過正…

    編程 2025-04-29
  • Python強制轉型的實現方法和應用場景

    本文主要介紹Python強制轉型的實現方法和應用場景。Python強制轉型,也叫類型轉換,是指將一種數據類型轉換為另一種數據類型。在Python中,強制轉型主要通過類型構造函數、轉…

    編程 2025-04-29
  • GloVe詞向量:從原理到應用

    本文將從多個方面對GloVe詞向量進行詳細的闡述,包括其原理、優缺點、應用以及代碼實現。如果你對詞向量感興趣,那麼這篇文章將會是一次很好的學習體驗。 一、原理 GloVe(Glob…

    編程 2025-04-27
  • Access執行按鈕的實現方法及應用場景

    本文將詳細介紹Access執行按鈕的實現方法及其在實際應用場景中的使用方法。 一、創建Access執行按鈕的方法 在Access中,創建執行按鈕的方法非常簡單。只需要按照以下步驟進…

    編程 2025-04-27
  • 編譯原理語法分析思維導圖

    本文將從以下幾個方面詳細闡述編譯原理語法分析思維導圖: 一、語法分析介紹 1.1 語法分析的定義 語法分析是編譯器中將輸入的字元流轉換成抽象語法樹的一個過程。該過程的目的是確保輸入…

    編程 2025-04-27
  • 用Python繪製櫻花飄落場景

    本文介紹如何用Python繪製一個帶有櫻花飄落特效的場景,通過本文的學習,您將了解到如何使用Python的turtle庫來繪製圖形,以及如何運用數學和物理知識來實現櫻花的飄落效果。…

    編程 2025-04-27
  • Python字典底層原理用法介紹

    本文將以Python字典底層原理為中心,從多個方面詳細闡述。字典是Python語言的重要組成部分,具有非常強大的功能,掌握其底層原理對於學習和使用Python將是非常有幫助的。 一…

    編程 2025-04-25

發表回復

登錄後才能評論