1. 程式人生 > >Js深度克隆解析

Js深度克隆解析

及其 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深度克隆解析