Js深度克隆解析
阿新 • • 發佈:2018-06-19
及其 div 發生 target 代碼 span class ray pre
Js克隆(clone),就是數據拷貝,包括基礎類型的數據和引用類型的數據,而深度克隆(deepClone)就是針對引用類型,如數組和對象。
兩種拷貝的區別在於:淺拷貝時,拷貝出的對象指向原對象的地址,當其值發生改變時,原對象的值也發生改變;
深度拷貝,拷貝出的對象指向一個新的地址,當其值發生改變時,原對象的值不受影響。
下面列出深度拷貝的代碼及其詳細註釋:
var obj = {//待拷貝的對象 name:"abc", age:"123", card:[‘visa‘,‘master‘], wife:{ name:"bcd", son:{ name:"aaa" } }, a:function(){} } function deepclone(origin , target){ var target = target || {}, tostr = Object.prototype.toString,//使用Object.prototype.toString.call方法進行對象和數組的區分,所以先將其進行存儲以便使用 arr = ‘[object Array]‘; for(var prop in origin){ if(origin.hasOwnProperty(prop)){//防止拷貝的對象從原對象的原型上取值 if(origin[prop] !== "null" && typeof(origin[prop]) == ‘object‘){//當遍歷到的數據為對象或數組時調用Object.prototype.toString.call方法 if(tostr.call(origin[prop]) == arr){//遍歷到數組,創建數組 target[prop] = []; }else{//遍歷到對象,創建對象 target[prop] = {}; } deepclone(origin[prop] , target[prop]);//對遍歷到的數組和對象再次深度克隆 }else{ target[prop] = origin[prop];//當遍歷到的數據為原始值時,直接進行賦值 } } } return target; } var target; console.log(deepclone(obj,target));//實現target深度拷貝obj
Js深度克隆解析