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

JavaScript最完整的深淺拷貝實(shí)現(xiàn)方式詳解

 更新時(shí)間:2022年02月28日 15:19:00   作者:Beannnnnnn  
這篇文章主要為大家詳細(xì)介紹了JavaScript最完整的深淺拷貝實(shí)現(xiàn)方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

深淺拷貝:

內(nèi)存中一共分為棧內(nèi)存和堆內(nèi)存兩大區(qū)域,所謂深淺拷貝主要是對(duì)js引用類型數(shù)據(jù)進(jìn)行拷貝一份,淺拷貝就是引用類型數(shù)據(jù)相互賦值之后,例obj1=obj2;如果后面的操作中修改obj1或者obj2,這個(gè)時(shí)候數(shù)據(jù)是會(huì)進(jìn)行相應(yīng)的變化的,因?yàn)樵趦?nèi)存中引用類型數(shù)據(jù)是存儲(chǔ)在堆內(nèi)存中,堆內(nèi)存中存放的是引用類型的值,同時(shí)會(huì)有一個(gè)指針地址指向棧內(nèi)存,兩個(gè)引用類型數(shù)據(jù)地址一樣,如果其中一個(gè)發(fā)生變化另外一個(gè)都會(huì)有影響;而深拷貝則不會(huì),深拷貝是會(huì)在堆內(nèi)存中重新開(kāi)辟一塊空間進(jìn)行存放;

簡(jiǎn)單來(lái)說(shuō)就是B復(fù)制了A,如果A發(fā)生了改變,如果B隨之變化,那么是淺拷貝,如果B并沒(méi)有發(fā)生變化,則是深拷貝。

基本類型拷貝

let a = 1;
let b = a;
b = 2;
console.log(a);//1
console.log(b);//2

a,b都是屬于基本類型,基本類型的復(fù)制是不會(huì)影響對(duì)方的,因?yàn)榛绢愋褪敲恳淮蝿?chuàng)建變量都會(huì)在棧內(nèi)存中開(kāi)辟一塊內(nèi)存,用來(lái)存放值,所以對(duì)基本類型進(jìn)行拷貝是不會(huì)對(duì)另外一個(gè)變量有影響的,屬于深拷貝。

數(shù)組拷貝 

concat() slice()

//  concat()
let list = ['a','b','c'];
let list2 = list.concat();
list2.push('d')
console.log(list);//['a','b','c']
console.log(list2);//['a','b','c','d']
//  slice()
let list = ['a','b','c'];
let list2 = list.slice();
list2.push('d')
console.log(list);//['a','b','c']
console.log(list2);//['a','b','c','d']

上面兩種方法只能實(shí)現(xiàn)數(shù)組類型里面的單層深拷貝,如果是多層無(wú)法實(shí)現(xiàn)深拷貝。

//二維數(shù)組
let list = ['a','b','c',['d','e','f']];
let list2 = list.concat();
list2[3][0] = 'a';
console.log(list);
console.log(list2);

可以看到原二維數(shù)組的值也發(fā)生了變化,說(shuō)明沒(méi)有實(shí)現(xiàn)深拷貝。

由此總結(jié),concat和slice只能實(shí)現(xiàn)一維數(shù)組的深拷貝,不能對(duì)多維數(shù)組進(jìn)行深拷貝,所以并不是一個(gè)完美的深拷貝方式。

對(duì)象拷貝

new Object()

let a = {id:1,name:'a',obj:{id:999}};
let b = new Object();
b.id = a.id;
b.name = a.name;
b.obj = a.obj;
a.name = 'b';
a.obj.id = 888;
console.log(a);
console.log(b);

 

a.name更改并沒(méi)有影響到b.name,好像可以看作深拷貝,但第二層obj里面里面的id隨之更改了,因此其實(shí)并不是深拷貝。

Object.assign

let a = {id:1,name:'a',obj:{id:999}};
function fun(obj){
    let o = {};
    Object.assign(o,obj);
    return o;
}
let a2 = fun(a);
a2.name ='a2';
a2.obj.id = 888;
console.log(a);
console.log(a2);

以上兩種方法,對(duì)于一層對(duì)象都能實(shí)現(xiàn)深拷貝,但對(duì)于多層對(duì)象則無(wú)法實(shí)現(xiàn),因此也不是一種完美的深拷貝方式。

JSON.parse(JSON.stringify( ))

let a = {
    name : 'a',
    age : 20,
    obj : {id:999},
    action : function(){
        console.log(this.name);
    }
}
let b = JSON.parse(JSON.stringify(a));
a.name = 'b';
a.obj.id = 888;
console.log(a);
console.log(b);

單層對(duì)象name和多層對(duì)象obj.id的改變都沒(méi)影響到原對(duì)象,因此是一個(gè)比較完美的深拷貝,但是能看到function好像并沒(méi)有被拷貝。

可以看出這個(gè)方法對(duì)于一層和多層都能實(shí)現(xiàn)深拷貝,但是這個(gè)方法的缺陷是不能拷貝Function,所以在使用時(shí),一定要注意數(shù)據(jù)類型。

遞歸

let a = {
    name:'a',
    skin:["red","blue","yellow",["123","456"]],
    child:{
        work:'none',
        obj:{
            id:999
        }
    },
    action:function(){
        console.log(this.name);
    }
}
//封裝的遞歸方法
    function copyWid(obj){
        let newObj = Array.isArray(obj)?[]:{};
        for (var i in obj){
            if(typeof obj[i] === 'object'){  //判斷是不是對(duì)象(數(shù)組或?qū)ο螅?
               newObj[i] = copyWid(obj[i])  //遞歸解決多層拷貝
            }else{
                newObj[i] = obj[i]   
            }
        }
        return newObj;
    };
    let b = copyWid(a);
    b.child.obj.id =888;
    b.skin[3][0] = "pink";
    console.log(a);
    console.log(b);

可以看到,無(wú)論是多層的對(duì)象還是多層的數(shù)組,都能實(shí)現(xiàn)深拷貝,而且能拷貝函數(shù),這個(gè)是目前來(lái)說(shuō)最完美的深拷貝方法。

通過(guò)這個(gè)遞歸能實(shí)現(xiàn)一個(gè)比較完美的深拷貝,能彌補(bǔ)上述提到的所有方法中的缺點(diǎn)。

展開(kāi)運(yùn)算符

let a = {name:'a',id:99};//如果是數(shù)組[xx,xx,xx],{...a}需要改成[...a]
let b ={...a};  //[...a]
a.id =88;
console.log(a);
console.log(b);

這個(gè)方法能實(shí)現(xiàn)對(duì)象數(shù)組單層時(shí)的深拷貝,但是多層無(wú)法實(shí)現(xiàn)深拷貝。

以上這么多方法,最優(yōu)解應(yīng)該屬于JSON和遞歸的方法(遞歸解決了JSON無(wú)法拷貝函數(shù)方法的問(wèn)題),但是根據(jù)需求數(shù)據(jù)類型的不同,可以選擇更簡(jiǎn)單的方式。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容! 

相關(guān)文章

  • javascript實(shí)現(xiàn)獲取字符串hash值

    javascript實(shí)現(xiàn)獲取字符串hash值

    Hash 可以看作是一個(gè) 關(guān)聯(lián)數(shù)組,它對(duì)每一個(gè)值都綁定了一個(gè)唯一的鍵(值并不必須是唯一的), 然而,它不能保證迭代時(shí)元素的順序始終一致。因?yàn)?JavaScript 程序語(yǔ)言的特性,每個(gè)對(duì)象實(shí)際上都是一個(gè) hash,下面我們就來(lái)詳細(xì)探討下。
    2015-05-05
  • javascript中this用法實(shí)例詳解

    javascript中this用法實(shí)例詳解

    這篇文章主要介紹了javascript中this用法,結(jié)合具體實(shí)例形式詳細(xì)分析了javascript中this的含義及對(duì)象、函數(shù)等各種調(diào)用中的使用技巧,需要的朋友可以參考下
    2017-04-04
  • javaScript嗅探執(zhí)行神器-sniffer.js

    javaScript嗅探執(zhí)行神器-sniffer.js

    本文主要介紹了javaScript嗅探執(zhí)行神器-sniffer.js的相關(guān)知識(shí)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • three.js創(chuàng)建樓層布局圖的示例代碼

    three.js創(chuàng)建樓層布局圖的示例代碼

    本文主要介紹了three.js創(chuàng)建樓層布局圖的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 如何在微信小程序中實(shí)現(xiàn)Mixins方案

    如何在微信小程序中實(shí)現(xiàn)Mixins方案

    這篇文章主要給大家介紹了關(guān)于如何在微信小程序中實(shí)現(xiàn)Mixins方案的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用微信小程序具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • JavaScript?Generator異步過(guò)度的實(shí)現(xiàn)詳解

    JavaScript?Generator異步過(guò)度的實(shí)現(xiàn)詳解

    生成器Generator是JavaScript?ES6引入的特性,它讓我們可以分段執(zhí)行一個(gè)函數(shù)。但是在談?wù)撋善鳎℅enerator)之前,我們要先了解迭代器Iterator
    2022-08-08
  • js 實(shí)現(xiàn) input type="file" 文件上傳示例代碼

    js 實(shí)現(xiàn) input type="file" 文件上傳示例代碼

    在開(kāi)發(fā)中,文件上傳必不可少但是它長(zhǎng)得又丑、瀏覽的字樣不能換,一般會(huì)讓其隱藏點(diǎn)其他的標(biāo)簽(圖片等)來(lái)時(shí)實(shí)現(xiàn)選擇文件上傳功能
    2013-08-08
  • 實(shí)現(xiàn)163郵箱的圖標(biāo)功能

    實(shí)現(xiàn)163郵箱的圖標(biāo)功能

    實(shí)現(xiàn)163郵箱的圖標(biāo)功能...
    2007-05-05
  • JavaScript?Promise多并發(fā)問(wèn)題的解決方法詳解

    JavaScript?Promise多并發(fā)問(wèn)題的解決方法詳解

    提起控制并發(fā),大家應(yīng)該不陌生,這篇文章主要來(lái)和大家介紹一下JavaScript如何解決Promise多并發(fā)問(wèn)題,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-09-09
  • javascript實(shí)現(xiàn)跟隨鼠標(biāo)移動(dòng)的圖片

    javascript實(shí)現(xiàn)跟隨鼠標(biāo)移動(dòng)的圖片

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)跟隨鼠標(biāo)移動(dòng)的圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09

最新評(píng)論

汝阳县| 达拉特旗| 和龙市| 阳新县| 枞阳县| 巴彦淖尔市| 莱芜市| 巢湖市| 青海省| 盐边县| 尚义县| 潜江市| 富锦市| 望奎县| 石嘴山市| 买车| 宿松县| 东阿县| 昌黎县| 建阳市| 锡林郭勒盟| 长葛市| 尼勒克县| 宜章县| 辉县市| 巴东县| 浦东新区| 静安区| 弥渡县| 西畴县| 乐清市| 彝良县| 宿松县| 荆州市| 临夏市| 宾阳县| 星座| 五大连池市| 湘乡市| 张家界市| 绥滨县|