1、對於
普通陣列
(陣列元素為數字或者字串
),深拷貝很簡單,拷貝之後兩個陣列指標指向的儲存位址不同,從而完成深拷貝
var _test = [1,2,3];//原陣列
var _testcopy =
.concat(_test)
;//拷貝陣列
_testcopy[0]=4;
console.log(_test);// [1,2,3]
console.log(_testcopy);//[4,2,3]
2、對於物件陣列
//形如
var _objarr=[,]
如果還是利用上述的.concat()方法拷貝陣列,則獲取的結果仍然是淺拷貝,改變其一,統統改變,例子:
var _test = [,];//原陣列
var _testcopy = .concat(_test);//拷貝陣列
_testcopy[1].name="girl";
console.log(_test);// [,]
console.log(_testcopy);//[,]
從例子上可以看出,這種對於物件陣列的拷貝,由於陣列內部屬性值為引用物件,因此整個拷貝還是淺拷貝,拷貝之後陣列各個值的指標還是指向相同的儲存位址,
那麼,如何完成此類陣列的深拷貝,根據普通陣列的深拷貝得到啟發,我拷貝乙個字串,不拷貝引用物件,拷貝字串會新闢乙個儲存位址,這樣就切斷了引用物件的指標聯絡,因此,得到的方法為:
var _test = [,];//原陣列
var _testcopy =
.concat(json.parse(json.stringify(_test)));//拷貝陣列,注意這行的拷貝方法
_testcopy[1].name="girl";
console.log(_test);// [,]
console.log(_testcopy);//[,]
至此,大功告成,一行**完成物件陣列的深拷貝!
3.對物件對深拷貝
var _testcopy =
json.parse(json.stringify(_test));
陣列和物件的深拷貝
改變原陣列 state const newarray this state.array newarray 0 1 newarray 1 0 0 this state.array 1 0 0 當新的陣列改變時,源陣列也發生了改變,這不是深拷貝 正確的拷貝方式 state 方法一 const newar...
陣列和物件的淺拷貝和深拷貝
前言 對於拷貝需要考慮資料的型別 資料型別分為 基本資料型別和引用型別 基本資料型別是儲存在棧中的簡單資料 常見 string,number,undefined,null,boolean以及es6新定義的symbol 引用型別值是引用型別例項,它是儲存在堆中的乙個物件,引用型別是一中資料結構 常見 ...
物件深拷貝
最近在專案中用到了物件拷貝這一塊,而且用到的是物件的深拷貝。下面就讓我們來看一下關於物件的拷貝 淺拷貝和深拷貝。先看一下深拷貝和淺拷貝的區別 概念 js 中的淺拷貝與深拷貝,只是針對複雜資料型別 object,array 的複製問題。淺拷貝與深拷貝都可以實現在已有物件上再生出乙份的作用。但是物件的例...