說說對深淺拷貝的理解
說到深淺拷貝,那肯定要提到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、手動複製。
綜述就是:在複製非基礎型別資料的時候,一直拷貝到基礎資料型別的複製就算深拷貝!