成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

用擴(kuò)展運(yùn)算符進(jìn)行深拷貝的注意事項(xiàng)

Juven / 318人閱讀

摘要:用擴(kuò)展運(yùn)算符深拷貝數(shù)組直接粘貼代碼當(dāng)數(shù)組是一維數(shù)組時(shí),擴(kuò)展運(yùn)算符可以進(jìn)行完全深拷貝,改變拷貝后數(shù)組的值并不會(huì)影響拷貝源的值。對(duì)象同理當(dāng)對(duì)象只有一層時(shí)可以用擴(kuò)展運(yùn)算符進(jìn)行完全深拷貝。

數(shù)組和對(duì)象的拷貝方式有很多,此處只針對(duì)擴(kuò)展運(yùn)算符...對(duì)數(shù)組和對(duì)象的深拷貝方式進(jìn)行說(shuō)明。

用擴(kuò)展運(yùn)算符深拷貝數(shù)組:
直接粘貼代碼:

    let arr = [1, 2, 3, 4, 5, 6];
    let arr1 = [...arr];
    arr1.push(7);
    console.log(arr); //[1, 2, 3, 4, 5, 6]
    console.log(arr1); //[1, 2, 3, 4, 5, 6, 7]

當(dāng)數(shù)組是一維數(shù)組時(shí),擴(kuò)展運(yùn)算符可以進(jìn)行完全深拷貝,改變拷貝后數(shù)組的值并不會(huì)影響拷貝源的值。
但是,當(dāng)數(shù)組為多維時(shí):

    let arr = [1, 2, 3, 4, 5, 6, [1, 2, 3]];
    let arr1 = [...arr];
    arr1.push(7);
    arr1[arr1.length - 2][0] = 100;
    console.log(arr); //[1, 2, 3, 4, 5, 6,[100, 2, 3]]
    console.log(arr1); //[1, 2, 3, 4, 5, 6, [100, 2, 3],7]

由上可見(jiàn),我們不難發(fā)現(xiàn)當(dāng)改變拷貝后數(shù)組中第二層數(shù)組的值時(shí),arr1arr1.length - 2 = 100;拷貝前數(shù)組第二層數(shù)組的值也跟著改變了。

對(duì)象同理:
當(dāng)對(duì)象只有一層時(shí):

    let obj = {
        name: "Wawa",
        age: 13,
        gender: "female"
    };
    let obj1 = {...obj
    };
    obj1.height = 165;
    console.log(obj);//{name: "Wawa", age: 13, gender: "female"}
    console.log(obj1);//{name: "Wawa", age: 13, gender: "female", height: 165}

可以用擴(kuò)展運(yùn)算符進(jìn)行完全深拷貝。

但當(dāng)對(duì)象有多層時(shí):

    let obj = {
        name: "Wawa",
        age: 13,
        gender: "female",
        hobby: {
            a: "Chinese",
            b: "Math",
            c: "English"
        }
    };
    let obj1 = {...obj
    };
    obj1.hobby.a = "PE";
    console.log(obj); //{name: "Wawa", age: 13, gender: "female",hobby:{a: "PE", b: "Math", c: "English"}}
    console.log(obj1); //{name: "Wawa", age: 13, gender: "female", ,hobby:{a: "PE", b: "Math", c: "English"},height: 165}

擴(kuò)展運(yùn)算符并不能打散第二層對(duì)象的值,且無(wú)法對(duì)其進(jìn)行深拷貝,拷貝前和拷貝后第二層對(duì)象的引用地址仍然是同一個(gè),一方改變,另一方也改變。

結(jié)論:用擴(kuò)展運(yùn)算符對(duì)數(shù)組或者對(duì)象進(jìn)行拷貝時(shí),只能擴(kuò)展和深拷貝第一層的值,對(duì)于第二層極其以后的值,擴(kuò)展運(yùn)算符將不能對(duì)其進(jìn)行打散擴(kuò)展,也不能對(duì)其進(jìn)行深拷貝,即拷貝后和拷貝前第二層中的對(duì)象或者數(shù)組仍然引用的是同一個(gè)地址,其中一方改變,另一方也跟著改變

另外有一個(gè)疑問(wèn),官方說(shuō)用Object.assign()拷貝時(shí)是淺拷貝,可無(wú)論我怎么操作都是深拷貝的效果,望大家指出理解錯(cuò)誤的地方,此處貼上測(cè)試的demo:

    let obj3 = {
        name: "Gucci",
        age: 13,
        gender: "female",
        hobby: {
            a: "Chinese",
            b: "Math",
            c: "English"
        }
    };
    let obj4 = Object.assign({}, obj3);
    obj4.hobby.a = "Math";
    obj3.age = 1000;
    console.log(obj3);
    console.log(obj4.age);

無(wú)論是一層還是二層,改變拷貝之后屬性的值,拷貝前對(duì)象中的任何值并沒(méi)有發(fā)生改變,且互不影響,這不是深拷貝嗎???

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98532.html

相關(guān)文章

  • 「前端面試題系列9」淺拷貝拷貝含義、區(qū)別及實(shí)現(xiàn)(文末有崗位內(nèi)推哦~)

    摘要:深拷貝與淺拷貝的出現(xiàn),就與這兩個(gè)數(shù)據(jù)類(lèi)型有關(guān)。這時(shí),就需要用淺拷貝來(lái)實(shí)現(xiàn)了。數(shù)據(jù)一但過(guò)多,就會(huì)有遞歸爆棧的風(fēng)險(xiǎn)。這個(gè)方法是在解決遞歸爆棧問(wèn)題的基礎(chǔ)上,加以改進(jìn)解決循環(huán)引用的問(wèn)題。但如果你并不想保持引用,那就改用用于解決遞歸爆棧即可。 前言 這是前端面試題系列的第 9 篇,你可能錯(cuò)過(guò)了前面的篇章,可以在這里找到: 數(shù)組去重(10 種濃縮版) JavaScript 中的事件機(jī)制(從原生到...

    caige 評(píng)論0 收藏0
  • ?搞不懂JS中賦值·淺拷貝·拷貝請(qǐng)看這里

    showImg(https://segmentfault.com/img/bVbvpCA); 前言 為什么寫(xiě)拷貝這篇文章?同事有一天提到了拷貝,他說(shuō)賦值就是一種淺拷貝方式,另一個(gè)同事說(shuō)賦值和淺拷貝并不相同。我也有些疑惑,于是我去MDN搜一下拷貝相關(guān)內(nèi)容,發(fā)現(xiàn)并沒(méi)有關(guān)于拷貝的實(shí)質(zhì)概念,沒(méi)有辦法只能通過(guò)實(shí)踐了,同時(shí)去看一些前輩們的文章總結(jié)了這篇關(guān)于拷貝的內(nèi)容,本文也屬于公眾號(hào)【程序員成長(zhǎng)指北】學(xué)習(xí)路線...

    lauren_liuling 評(píng)論0 收藏0
  • 入理解JS拷貝

    摘要:深拷貝相比于淺拷貝速度較慢并且花銷(xiāo)較大。所以在賦值完成后,在棧內(nèi)存就有兩個(gè)指針指向堆內(nèi)存同一個(gè)數(shù)據(jù)。結(jié)果如下擴(kuò)展運(yùn)算符只能對(duì)一層進(jìn)行深拷貝如果拷貝的層數(shù)超過(guò)了一層的話,那么就會(huì)進(jìn)行淺拷貝那么我們可以看到和展開(kāi)原算符對(duì)于深淺拷貝的結(jié)果是一樣。 JS中數(shù)據(jù)類(lèi)型 基本數(shù)據(jù)類(lèi)型: undefined、null、Boolean、Number、String和Symbol(ES6) 引用數(shù)據(jù)類(lèi)型:...

    JackJiang 評(píng)論0 收藏0
  • 關(guān)于JavaScript拷貝拷貝

    摘要:引用類(lèi)型值引用類(lèi)型值是保存在堆內(nèi)存中的對(duì)象,變量保存的只是指向該內(nèi)存的地址,在復(fù)制引用類(lèi)型值的時(shí)候,其實(shí)只復(fù)制了指向該內(nèi)存的地址。 前言 要理解 JavaScript中淺拷貝和深拷貝的區(qū)別,首先要明白JavaScript的數(shù)據(jù)類(lèi)型。JavaScript有兩種數(shù)據(jù)類(lèi)型,基礎(chǔ)數(shù)據(jù)類(lèi)型和引用數(shù)據(jù)類(lèi)型。js的基本類(lèi)型:undefined,null,string,boolean,number,s...

    shenhualong 評(píng)論0 收藏0
  • JavaScript·隨記 拷貝 vs. 淺拷貝

    摘要:而在這個(gè)運(yùn)算符的相關(guān)用例中,往往會(huì)涉及到其他知識(shí)點(diǎn),深拷貝和淺拷貝就是其中之一。即對(duì)象的淺拷貝會(huì)對(duì)主對(duì)象的值進(jìn)行拷貝,而該值有可能是一個(gè)指針,指向內(nèi)存中的同一個(gè)對(duì)象。,可以看到深拷貝和淺拷貝是對(duì)復(fù)制引用類(lèi)型變量而言的。 在ES6的系列文章中,基本都會(huì)提到Spread——擴(kuò)展運(yùn)算符(...)。而在這個(gè)運(yùn)算符的相關(guān)用例中,往往會(huì)涉及到其他知識(shí)點(diǎn),深拷貝和淺拷貝就是其中之一。 背景知識(shí) 在討...

    RyanQ 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<