淺拷貝和深拷貝的理解和實現

一、爲何會有淺拷貝和深拷貝

首先要知道JS中數據結構分爲值類型和引用類型。
值類型直接指向一塊內存,內存中村放的是變量的值。
引用類型也會指向一塊內存,內存中存放的是變量值的地址,而不是真的值自己。
那麼引用類型中,值的變化會致使全部指向這塊內存地址的變量得到的返回值都發生改變。在實際開發中,有時候咱們並不但願如此,因此就出現了拷貝。
那麼拷貝的含義就是把引用類型的值,從新開一個新的內存,放進去,這樣在更改原來的值時,現有的值不會更改,引用類地址的變量也就不會更改了。

二、淺拷貝

淺拷貝只會獲取對象的第一層屬性或方法,若是屬性依舊是一個對象,那麼淺拷貝不會對屬性裏的對象的值再次開一個內存作存儲,而是依舊沿用原來的地址。在簡單的對象中使用淺拷貝便可。

三、淺拷貝的實現

大部分原聲的函數返回一個新的對象都是淺拷貝。
例如:
一、Object.assign();
二、Array.concat();

四、深拷貝

深拷貝是對對象中每一層的對象進行拷貝。淺拷貝中,不是完整的拷貝。若是屬性的對象的值發生變化依然可以影響拷貝後的對象,因此就須要深拷貝。

五、深拷貝的實現

若是是簡單的對象,沒有方法,那麼最簡單的方式是經過JSON進行轉換,能知足大部分需求。須要注意的是,瀏覽器是否支持JSON
代碼:
var newObject = JSON.parse(JSON.stringify(oldObject));
自定義函數:
function deepCopy(o) {
   var out, v, key;
   out = Array.isArray(o) ? [] : {};
   for (key in o) {
       v = o[key];
       out[key] = (typeof v === "object") ? deepCopy(v) : v;
   }
   return out;
}

參考

stackoverflow地址:
http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-deep-clone-an-object-in-javascript/122704#
相關文章
相關標籤/搜索