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

資訊專欄INFORMATION COLUMN

深淺拷貝

yck / 2052人閱讀

摘要:好像栗子不是那么好吃,那我們來(lái)看看下面的解釋吧深淺拷貝深拷貝和淺拷貝只針對(duì)像這樣的引用類型數(shù)據(jù)。深拷貝則是開(kāi)啟一個(gè)新的棧,兩個(gè)對(duì)象對(duì)應(yīng)兩個(gè)不同的引用地址,修改一個(gè)對(duì)象的屬性,不會(huì)改變另一個(gè)對(duì)象的屬性。

拷貝顧名思義就是復(fù)制,但是它并不簡(jiǎn)單哦,拷貝分為深淺拷貝,那么啥是深拷貝啥是淺拷貝呢,讓我們來(lái)舉個(gè)栗子,淺拷貝就是當(dāng)你拷貝別人的U盤里東西時(shí),卻沒(méi)有新建文件存放在自己的電腦里,直接在里面修改,那么我們就更改了U盤里的內(nèi)容,深拷貝就是在自己的電腦里新建了文件進(jìn)行修改,而不會(huì)影響到原來(lái)的內(nèi)容。好像栗子不是那么好吃,那我們來(lái)看看下面的解釋吧?。?!

深淺拷貝

1.深拷貝和淺拷貝只針對(duì)像Object, Array這樣的引用類型數(shù)據(jù)。

2.淺拷貝是對(duì)對(duì)象引用地址進(jìn)行拷貝,并沒(méi)有開(kāi)辟新的棧,也就是拷貝后的結(jié)果是兩個(gè)對(duì)象指向同一個(gè)引用地址,修改其中一個(gè)對(duì)象的屬性,則另一個(gè)對(duì)象的屬性也會(huì)改變。

3.深拷貝則是開(kāi)啟一個(gè)新的棧,兩個(gè)對(duì)象對(duì)應(yīng)兩個(gè)不同的引用地址,修改一個(gè)對(duì)象的屬性,不會(huì)改變另一個(gè)對(duì)象的屬性。

淺拷貝

直接上栗子吧

var myInfo = {name:"liu",sex:"女"};
var newInfo = myInfo;
console.log(myInfo); //{name:"liu",sex:"女"}
newInfo.sex = "小仙女";
console.log(myInfo); //{name:"liu",sex:"小仙女"}

可以看到newInfo復(fù)制了myInfo里的內(nèi)容,本應(yīng)他們之間沒(méi)有聯(lián)系的,可是為什么當(dāng)newInfo更改時(shí)同時(shí)也影響了myInfo?那是因?yàn)檫@只是淺拷貝,newInfo的地址并沒(méi)有更改,指向同一個(gè)棧。

深拷貝

讓我們先對(duì)比一下下面的兩個(gè)栗子吧!

var array = [{a:1,b:2},{a:3,b:4}];
var newArray = Object.assign([],array);
newArray.length = 1;
console.log(newArray);  
console.log(array);  
newArray[0].a = 123;
console.log(array[0]); 
function deepClone(obj){    
  if(!obj&& typeof obj!== "object"){      
    return;    
  }    
  var newObj= obj.constructor === Array ? [] : {};    
  for(var key in obj){       
    if(obj[key]){          
      if(obj[key] && typeof obj[key] === "object"){  
        newObj[key] = obj[key].constructor === Array ? [] : {}; 
        //遞歸
        newObj[key] = deepClone(obj[key]);          
      }else{            
        newObj[key] = obj[key];         
      }       
    }    
  }    
  return newObj; 
}
var array = [{a:1,b:2},{a:3,b:4}];
var newArray = deepClone(array);
console.log(array[0]);
newArray[0].a = 123;
console.log(array[0]);

大家思考一下,這兩個(gè)栗子會(huì)是一樣嗎?

來(lái)公布一下正確答案:
先看第一個(gè)栗子
[{a:1,b:2},{a:3,b:4}]
{a: 123, b: 2}
(問(wèn)號(hào)臉)我明明沒(méi)有更改myInfo的數(shù)據(jù)啊,這么回事?
因?yàn)镺bject.assign并不是深拷貝,是披著深拷貝外衣的淺拷貝。最多也是Object.assign會(huì)拷貝第一層的值,對(duì)于第一層的值都是深拷貝,而到第二層的時(shí)候就是復(fù)制引用。類似的情況還有,slice方法和concat方法等。

來(lái)看看第二個(gè)
{a:1,b:2}
{a:1,b:2}
兩個(gè)結(jié)果都是一樣的,為什么呢?
因?yàn)檫@才是深拷貝啊,newInfo開(kāi)啟了一個(gè)新的棧,雖然內(nèi)容相同,可是他們已經(jīng)在不同地點(diǎn)了,互不影響。這里我們采用了封裝和遞歸,如果對(duì)象屬性的值是引用類型(Array,Object),那么對(duì)該屬性進(jìn)行深拷貝,直到遍歷到屬性的值是基本類型為止。好像有點(diǎn)復(fù)雜誒,沒(méi)事,我們還有個(gè)簡(jiǎn)單粗暴的方法?。?!

var newArray = JSON.parse(JSON.stringify(array));
console.log(array[0])//{a:1,b:2}
newArray[0].a = 123
console.log(array[0])//{a:1,b:2}

利用JSON解析函數(shù)把對(duì)象轉(zhuǎn)成字符串,再把字符串轉(zhuǎn)成對(duì)象!四不四很簡(jiǎn)單呀!?

這就是我對(duì)于深淺拷貝的了解了,如果有更好的見(jiàn)解要告訴我哦!?

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

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

相關(guān)文章

  • JS專題之深淺拷貝

    摘要:在之前的文章專題之?dāng)?shù)據(jù)類型和類型檢測(cè)中我有講過(guò),中的數(shù)據(jù)類型分為兩種,基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,基本數(shù)據(jù)類型是保存在棧的數(shù)據(jù)結(jié)構(gòu)中的是按值訪問(wèn),所以不存在深淺拷貝問(wèn)題。 前言 在開(kāi)發(fā)過(guò)程中,偶爾會(huì)遇到這種場(chǎng)景,拿到一個(gè)數(shù)據(jù)后,你打算對(duì)它進(jìn)行處理,但是你又希望拷貝一份副本出來(lái),方便數(shù)據(jù)對(duì)比和以后恢復(fù)數(shù)據(jù)。 那么這就涉及到了 JS 中對(duì)數(shù)據(jù)的深淺拷貝問(wèn)題,所謂深淺拷貝,淺拷貝的意思就是,...

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

    摘要:深拷貝相比于淺拷貝速度較慢并且花銷較大。所以在賦值完成后,在棧內(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ù)類型 基本數(shù)據(jù)類型: undefined、null、Boolean、Number、String和Symbol(ES6) 引用數(shù)據(jù)類型:...

    JackJiang 評(píng)論0 收藏0
  • 深淺拷貝

    摘要:深復(fù)制實(shí)現(xiàn)代碼如下第一種方法通過(guò)遞歸解析解決第二種方法通過(guò)解析解決作者六師兄鏈接原生深拷貝的實(shí)現(xiàn)處理未輸入新對(duì)象的情況通過(guò)方法構(gòu)造新的對(duì)象 深淺拷貝針對(duì)的是 對(duì)象類型,如果是字符串的數(shù)組用[...arr],還是不會(huì)影響 要區(qū)分針對(duì)數(shù)組的深淺拷貝(默認(rèn)情況為里面沒(méi)有對(duì)象的數(shù)組),與針對(duì)對(duì)象的深淺拷貝 JavaScript數(shù)組深拷貝和淺拷貝的兩種方法 let a1 = [1, 2]; ...

    Karrdy 評(píng)論0 收藏0
  • Javascript對(duì)象的深淺拷貝

    摘要:開(kāi)門見(jiàn)山,有人叫對(duì)象的復(fù)制為深復(fù)制淺復(fù)制,也有人叫深拷貝淺拷貝。高級(jí)屬性修改深拷貝滿足對(duì)象的復(fù)制,淺拷貝影響原數(shù)組。關(guān)于對(duì)象的深淺拷貝,暫且探索到這里,后續(xù)有新發(fā)現(xiàn)再進(jìn)行補(bǔ)充。 showImg(https://segmentfault.com/img/remote/1460000014305581); 開(kāi)門見(jiàn)山,有人叫對(duì)象的復(fù)制為深復(fù)制淺復(fù)制,也有人叫深拷貝淺拷貝。其實(shí)都是copy。 ...

    qieangel2013 評(píng)論0 收藏0
  • 9012年,當(dāng)我們討論js深淺拷貝時(shí)我們?cè)谡f(shuō)些什么?

    摘要:正文討論深淺拷貝,首先要從的基本數(shù)據(jù)類型說(shuō)起根據(jù)中的變量類型傳遞方式,分為值類型和引用類型,值類型變量包括。當(dāng)你拷貝的對(duì)象有多級(jí)的時(shí)候,就是深拷貝。數(shù)據(jù)不存在則對(duì)其拷貝。 前言: 本文主要閱讀對(duì)象:對(duì)深淺拷貝印象模糊對(duì)初級(jí)前端,想對(duì)js深淺拷貝聊一聊的中級(jí)前端。 如果是對(duì)這些有完整對(duì)認(rèn)知體系和解決方法的大佬,可以選擇略過(guò)。 正文: 討論深淺拷貝,首先要從js的基本數(shù)據(jù)類型說(shuō)起: 根據(jù) J...

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

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

0條評(píng)論

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