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

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

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

前言

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

深淺拷貝的理解

淺拷貝

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

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

極簡(jiǎn)代碼理解就是:

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

深拷貝

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

深淺拷貝的方法

淺拷貝的5種常用方法

1. 對(duì)象展開運(yùn)算符{...obj},最簡(jiǎn)潔的實(shí)現(xiàn)方式,適用于普通對(duì)象

const shallowCopy = { ...userInfo };

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

const shallowCopy = { ...originArr };

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

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

4.數(shù)組slice(),數(shù)組截取(不傳參時(shí)等價(jià)于淺拷貝)

const shallowCopy = originalArr.slice();

5.數(shù)組concat(),拼接空數(shù)組實(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.遞歸遍歷拷貝, 自定義實(shí)現(xiàn)(靈活處理所有類型,需手寫邏輯),面試手寫題常考

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.第三方庫(kù), 穩(wěn)定可靠(開發(fā)首選)

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

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

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

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

    javascript中的正則表達(dá)式使用詳解

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

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

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

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

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

    js實(shí)現(xiàn)一個(gè)簡(jiǎn)易計(jì)算器

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

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

    這篇文章主要為大家詳細(xì)介紹了基于Three.js實(shí)現(xiàn)360度全景圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    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ù)對(duì)象、作用域三者之間的關(guān)系。
    2010-10-10

最新評(píng)論

仙居县| 日喀则市| 环江| 新丰县| 昌邑市| 保山市| 安西县| 新河县| 长泰县| 克东县| 伊川县| 封丘县| 天台县| 额敏县| 庆云县| 苏尼特左旗| 新民市| 固安县| 浑源县| 涿州市| 兴安县| 三台县| 闵行区| 宜黄县| 乐业县| 农安县| 邵武市| 西宁市| 苏州市| 嘉峪关市| 临泉县| 紫云| 茶陵县| 南川市| 富裕县| 宁乡县| 澄江县| 文化| 固阳县| 十堰市| 淄博市|