天天看點

深度解析javascript中的淺複制和深複制

       在談javascript的淺複制和深複制之前,我們有必要在來讨論下js的資料類型。我們都知道有Number,Boolean,String,Null,Undefined,Object五種類型。而Object又包含Function,Array和Object自身。前面的五種類型叫做基本類型,而Object是引用類型。可能有人就要問,為什麼要分基本類型和引用類型呢?後面你就會明白的。

     我們首先來看看淺複制和深複制的簡潔定義:

深複制:直接将資料複制給對應的變量

淺複制:将資料的位址複制給對應的變量

而資料類型和我們要讨論的複制類型又有怎樣的聯系呢?我們試着摸索一下吧

實驗一:

這段代碼中我們把a指派給a1,當a的值改變時,a1沒有發生變化。

實驗二:

在這段代碼中我們同樣把a指派給a1,當a的值改變的時候,a1卻發生了變化。

     這是咋回事了,同樣的操作其結果怎麼會有差異了?我們回頭看看,聰明的一休認為可能是這兩個a有些不同。那些不同了?前面的是字元串,後面的數組。好像就是我們前面提到的基本類型和資料類型吧。那我們把資料類型換一下看看會有什麼結果。

實驗三:

實驗四:

    在這兩組實驗中,我們把資料類型分别換成了Number型和Object類型。實驗三中可以發現a1不随a值的變化而變化,實驗四中a會随着a1的變化而變化(這裡和實驗二略有不同,改變的是a1,當然你改變a的話,a1也會跟着變化)

   似乎我們可以得出個一般性的結論了:

    js中基本類型的指派為深複制,而引用類型的指派為淺複制。

   現在有必要把深複制和淺複制的定義擴充一下了。

淺複制:就是把資料的位址指派給對應變量,而沒有把具體的資料複制給變量,變量會随資料值的變化而變化。

深複制:就是把資料指派給對應的變量,進而産生一個與源資料不相幹的新資料(資料位址已變化)。

實驗五:

     按照我們上面的理論來講,這裡是淺複制。a1應該随着a的變化而變化呀,可在這裡為什麼會事與願違了?這就是引用類型惹的禍了。對象指派其實都是引用傳值,傳遞的是一個位址。那麼實驗五中的第四行其實就是把變量a指向了一個新的位址。而a1還是指向的原來那個位址,原來位址中的值沒變,是以a1就不會變。是以請記住:淺複制不會随着存儲資料位址的變化而變化,隻會随着資料值的變化而變化。

     那我們如何實作引用類型的深度複制呢?這就是老話題深度克隆了。就是需要自己寫一個非原生的clone函數喽。

    小可不才,文章中定會有所纰漏,望指出。也學一下大牛的語氣,此文原創,轉載請注明出處。如果你覺得文章還不錯,就怒頂并推薦一下下吧!!!!

繼續閱讀