一行程式碼完成js物件陣列的深拷貝
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=[{"name":''weifeng"},{"name":"boy"}]
如果還是利用上述的[].concat()方法拷貝陣列,則獲取的結果仍然是淺拷貝,改變其一,統統改變,例子:
var _test = [{"name":"weifeng"},{"name":"boy"}];//原陣列
var _testCopy = [].concat(_test);//拷貝陣列
_testCopy[1].name="girl";
console.log(_test);// [{"name":"weifeng"},{"name":"girl"}]
console.log(_testCopy);//[{"name":"weifeng"},{"name":"girl"}]
從例子上可以看出,這種對於物件陣列的拷貝,由於陣列內部屬性值為引用物件,因此整個拷貝還是淺拷貝,拷貝之後陣列各個值的指標還是指向相同的儲存地址,
那麼,如何完成此類陣列的深拷貝,根據普通陣列的深拷貝得到啟發,我拷貝一個字串,不拷貝引用物件,拷貝字串會新闢一個儲存地址,這樣就切斷了引用物件的指標聯絡,因此,得到的方法為:
var _test = [{"name":"weifeng"},{"name":"boy"}];//原陣列
var _testCopy = [].concat(JSON.parse(JSON.stringify(_test)));//拷貝陣列,注意這行的拷貝方法
_testCopy[1].name="girl";
console.log(_test);// [{"name":"weifeng"},{"name":"boy"}]
console.log(_testCopy);//[{"name":"weifeng"},{"name":"girl"}]
至此,大功告成,一行程式碼完成物件陣列的深拷貝!