1. 程式人生 > >說說對深淺拷貝的理解

說說對深淺拷貝的理解

說到深淺拷貝,那肯定要提到JavaScript的資料型別,先從資料型別說起。

JavaScript有兩種資料型別:基礎資料型別和引用資料型別。

基礎資料型別又有以下幾種: null 、undefined、number、string、Boolean;

引用資料型別包括:object、array、function;

基礎資料型別都是按值訪問的,我們可以直接操作儲存在變數中的實際的值。而引用型別如Array,我們不能直接操作物件的堆記憶體空間,引用型別的值都是按引用訪問的,即儲存在變數物件中的一個地址,該地址與堆記憶體的實際值相關聯。

下面要說正事啦!!

深拷貝與淺拷貝的區別:

淺拷貝只複製指向走個物件的指標,而不是複製物件本身,新舊物件共享一塊記憶體;

深拷貝複製並建立一個一模一樣的物件,不共享記憶體,修改新物件,舊物件保持不變。

基礎資料型別的資料不存在淺拷貝,只有引用資料型別存在深淺拷貝的區別,深拷貝就是一直拷貝到基礎資料型別為止;

下面再說幾種常見的深拷貝的實現方式:

1、Object.assign()

Object.assign()是一種可以對非巢狀物件進行深拷貝的方法,如果物件中出現巢狀情況,那麼其對被巢狀物件的行為就成了普通的淺拷貝。

2、轉成JSON

用JSON.stringify把物件轉成字串,再用JSON.parse把字串轉成新的物件。

但這種方法的缺陷是會破壞原型鏈,並且無法拷貝屬性值為function的屬性。

3、遞迴

採用遞迴的方法去複製拷貝物件

4、使用Object.create()方法

直接使用var newObj = Object.create(oldObj),可以達到深拷貝的效果。

5、jquery有提供一個$.extend可以用來做深拷貝。

6、手動複製。

綜述就是:在複製非基礎型別資料的時候,一直拷貝到基礎資料型別的複製就算深拷貝!