最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文徹底解讀前端深淺拷貝的理解和幾種使用方法

 更新時間:2026年02月11日 09:49:29   作者:LeeAt  
在前端面試當(dāng)中,經(jīng)常會被問到淺拷貝與深拷貝的問題,這主要是考察面試者對基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的理解,這篇文章主要介紹了前端深淺拷貝理解和幾種使用方法的相關(guān)資料,需要的朋友可以參考下

前言

深拷貝和淺拷貝是面試中經(jīng)常被問到了,理解其原理和深淺拷貝差異以及多種深淺拷貝方法才能熟練在實際項目中使用做到游刃有余。本文將從作用原理到具體代碼實現(xiàn)和多種使用方法進行展開解讀。

深淺拷貝的理解

淺拷貝

淺拷貝從字面意義上就是淺層的拷貝對象,不涉及到深層次的拷貝,也就是說只復(fù)制對象表層數(shù)據(jù),只是為原來的對象創(chuàng)建新的內(nèi)存,但是嵌套的引用類型(如:數(shù)組、子對象)仍然需要與原對象共享內(nèi)存,修改副本的嵌套字段會同步影響原對象,進而產(chǎn)生污染。

其核心就是,由于JS的數(shù)據(jù)類型的存儲機制,基本類型(字符串、數(shù)字等)直接存在內(nèi)存中,復(fù)雜類型(對象、數(shù)組等)在棧中只存堆內(nèi)存的地址引用,而堆內(nèi)存才存實際的數(shù)據(jù)。淺拷貝時,只是復(fù)制棧內(nèi)存而不對堆內(nèi)存進行復(fù)制。 如圖:

極簡代碼理解就是:

// 原始對象
const userInfo = { 
    name: "張三", // 基本類型(直接存在棧內(nèi)存里) 
    address: { city: "北京" } // 復(fù)雜數(shù)據(jù)類型(地址引用在棧,實際數(shù)據(jù)在堆) 
    };
// 淺拷貝:創(chuàng)建新對象
const formData = { ...userInfo }; 
// 1. 對比新對象本身的地址
console.log(userInfo === formData); // false,說明地址不同,是新的內(nèi)存
// 2. 對比嵌套address的地址
console.log(userInfo.address === formData.address); // true,相同,說明內(nèi)存共享,指向的是同一個地址
// 3. 修改嵌套字段,驗證污染 
formData.address.city = "上海"; 
console.log(userInfo.address.city); // 輸出"上海",說明原對象被污染了

深拷貝

理解了淺拷貝,深拷貝就是完全復(fù)制原始對象及所有的嵌套數(shù)據(jù),會為原對象和所有嵌套的引用類型(如數(shù)組、子對象)創(chuàng)建獨立的內(nèi)存空間,副本與原對象徹底隔離,修改副本不會影響到原對象。

深淺拷貝的方法

淺拷貝的5種常用方法

1. 對象展開運算符{...obj},最簡潔的實現(xiàn)方式,適用于普通對象

const shallowCopy = { ...userInfo };

2.數(shù)組展開運算符,數(shù)組專屬淺拷貝

const shallowCopy = { ...originArr };

3.Object.assign(target,source),可以合并多個對象,僅淺拷貝源對象表層

const shallowCopy = Object.assign({},userInfo1,userInfo2,userInfo3,....);

4.數(shù)組slice(),數(shù)組截?。ú粋鲄r等價于淺拷貝)

const shallowCopy = originalArr.slice();

5.數(shù)組concat(),拼接空數(shù)組實現(xiàn)淺拷貝

const shallowArr = originalArr.concat([]);

深拷貝的4種常用方法

1.JSON.parse(JSON.stringify(obj)),最常用(局限性:不支持函數(shù)、Symbol、Date、RegExp)

const deepCopy = JSON.parse(JSON.stringify(userInfo));

2.遞歸遍歷拷貝, 自定義實現(xiàn)(靈活處理所有類型,需手寫邏輯),面試手寫題???/p>

function deepClone(obj){
    // 類型判斷 
    if(obj isntanceof Date) return new Date(obj);
    if(obj instanceof RegExp) return new RegExp(obj);
    if(obj instanceof Error) return new Error(obj.message);
    if(obj instanceof Function) return function(...args){
        return obj.call(this,...args);
    };
    if( obj === null || typeof obj !== 'object') return obj;
    
    const newObj = Array.isArray(obj) ? [] : {};
    
    for(let key in obj){
        if(Object.hasOwn(obj,key)){
            if(typeof obj[key] === "object"){
                newObj[key] = deepClone(obj[key]); // 遞歸拷貝嵌套層
            }
            else{
                newObj[key] = obj[key]
            }
        }
         
    }
    return newObj;
}

3.第三方庫, 穩(wěn)定可靠(開發(fā)首選)

  • Lodash中的 _.cloneDeep(obj)(支持所有類型,處理循環(huán)引用)
  • jQuery中的 $.extend(true,{},obj)(第一個參數(shù)為true表示深拷貝)

4.structuredClone(), 瀏覽器原生API,支持循環(huán)引用、Date/RegExp,但不支持函數(shù)

總結(jié)

到此這篇關(guān)于前端深淺拷貝的理解和幾種使用方法的文章就介紹到這了,更多相關(guān)深淺拷貝理解和使用方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • javascript貪吃蛇游戲設(shè)計與實現(xiàn)

    javascript貪吃蛇游戲設(shè)計與實現(xiàn)

    這篇文章主要為大家詳細介紹了javascript貪吃蛇游戲設(shè)計與實現(xiàn),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • JavaScript數(shù)組塌陷實例解析

    JavaScript數(shù)組塌陷實例解析

    這篇文章主要為大家介紹了JavaScript數(shù)組塌陷實例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • js實現(xiàn)滾動條自動滾動到最底部示例代碼

    js實現(xiàn)滾動條自動滾動到最底部示例代碼

    這篇文章主要給大家介紹了關(guān)于js實現(xiàn)滾動條自動滾動到最底部的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2023-06-06
  • javascript中的正則表達式使用詳解

    javascript中的正則表達式使用詳解

    之前講了javascript對正則表達式的實現(xiàn)方式了,只定義了正則表達式,但是如何在javascript中真正使用正則表達式呢?在javascript中RegExp和String對象都有處理正則表達式的方法。
    2015-08-08
  • javascript彈出窗口實現(xiàn)代碼

    javascript彈出窗口實現(xiàn)代碼

    這篇文章主要介紹了javascript彈出窗口實現(xiàn)代碼,非常人性化的設(shè)計,點擊頁面可以彈出窗口,感興趣的小伙伴們可以參考一下
    2015-11-11
  • 深度解析JavaScript中作用域與作用域鏈

    深度解析JavaScript中作用域與作用域鏈

    作用域(Scope)與作用域鏈(Scope Chain)是 JavaScript 的核心概念,它們決定了變量的可訪問范圍、生命周期,以及代碼運行時變量查找的規(guī)則,下面小編就和大家詳細講講吧
    2025-11-11
  • js實現(xiàn)一個簡易計算器

    js實現(xiàn)一個簡易計算器

    這篇文章主要為大家詳細介紹了JS實現(xiàn)一個簡易計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 基于Three.js實現(xiàn)360度全景圖片

    基于Three.js實現(xiàn)360度全景圖片

    這篇文章主要為大家詳細介紹了基于Three.js實現(xiàn)360度全景圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • Hutia 的 JS 代碼集

    Hutia 的 JS 代碼集

    Hutia 的 JS 代碼集...
    2006-10-10
  • 理解Javascript_13_執(zhí)行模型詳解

    理解Javascript_13_執(zhí)行模型詳解

    在《理解Javascript_12_執(zhí)行模型淺析》一文中,我們初步的了解了執(zhí)行上下文與作用域的概念,那么這一篇將深入分析執(zhí)行上下文的構(gòu)建過程,了解執(zhí)行上下文、函數(shù)對象、作用域三者之間的關(guān)系。
    2010-10-10

最新評論

平昌县| 方山县| 怀化市| 行唐县| 建德市| 德保县| 石楼县| 翼城县| 绥德县| 千阳县| 眉山市| 枣庄市| 乳源| 蓝田县| 绥化市| 偏关县| 吴堡县| 赣州市| 芷江| 唐山市| 抚州市| 维西| 高台县| 平乡县| 安康市| 黔南| 天柱县| 武乡县| 霍山县| 周口市| 二手房| 七台河市| 晋宁县| 郓城县| 永登县| 迁西县| 永顺县| 南丰县| 甘孜县| 封开县| 雅安市|