拷貝資料分為兩種型別:
1、基本資料型別:拷貝後會生成乙份新的資料,修改拷貝以後的資料不會影響原資料(沒有深淺拷貝之說)
2、物件/陣列:拷貝後不會生成新的資料,而拷貝的是引用,修改拷貝以後的資料會影響原來的資料(有深淺拷貝之說)
注意:影響原資料的是淺拷貝拷貝資料的方法:
1、直接賦值給乙個變數(淺拷貝)
let obj=;2、object.assign()(淺拷貝)let obj1=obj;
修改obj1的資料會影響obj的資料,所以是淺拷貝
let obj2=object.assign(obj);3、array.prototype.concat()(淺拷貝)將源物件的屬性賦值到目標物件上,此時obj2就有obj中的屬性,修改obj2會影響原來的資料
let arr=[1,2,3,4,];4、array.prototype.slice()(淺拷貝)let arr1=arr.concat() // concat是連線陣列,如果不傳參,則表示複製原陣列的資料到目標陣列中
注意:使用此方法時,陣列中的基本資料型別的資料照樣是生成乙份新資料拷貝到新陣列中,所以修改新陣列的基本資料型別的資料不會影響原陣列,如果修改陣列中的物件,同樣拷貝的是乙份物件的引用到新陣列中,所以修改新陣列的物件會直接影響原來陣列的物件資料。這跟直接賦值有一定的區別
let arr2=arr.slice(); //slice是擷取陣列或者字串,不傳參表示預設全部5、json.parse(json.stringfy())(深拷貝)
let arr3=json.parse(json.stringify(arr));//先把原陣列轉換為json字串,變為基本資料型別,完全生成乙份新資料,然後把新資料轉換為js原陣列,就利用了這一點,實現了深拷貝
// 實現深度轉殖----物件/陣列
function checkedtype(target)
function clone(target)
}else if(targettype === 'array')else
//遍歷目標資料
for(let i in target)else
}return result;
}let arr=[1,2,];
let arr1=clone(arr);
console.log(arr1);
arr1[2].username='gmx';
console.log(arr,arr1);
深度轉殖物件
有時,我們需要對乙個物件進行複製,如下列要求 1.使用遞迴來實現乙個深度轉殖,可以複製乙個目標物件,返回乙個完整拷貝 2.被複製的物件型別會被限制為數字 字串 布林 日期 陣列 object物件。function isobject obj function cloneobject obj 判斷物件型...
深度轉殖剖析
深度遍歷 思路 遍歷物件 for var key in object 判斷是否是原始值 typeof 判斷是物件還是陣列 instanceof看原型鏈有無其原型 tostring constructor 因父子域問題最好使用tostring 建立相應的陣列或物件 function deepclone...
深度轉殖遞迴
function deepclone origin,target 防止target為空 var tostring object.prototype.tostring,arrclass object array objectclass object object for var prop in ori...