JS 深拷貝實現

2021-09-21 18:36:57 字數 1055 閱讀 9194

web平台上一直在刻意的避開深拷貝,一直使用json.parse(json.stringify(object))避開深拷貝的問題。知道今天碰見個bug,json將function轉化為了字串,排到這個bug時,憔悴…

若是node.js平台的話,一直現成的輪子等著挑,可惜是web,不太敢亂引入,手寫乙個<_<

/**

* 深拷貝

* 支援型別:boolean,number,string,null,undefined,array,object

* @param obj

*/function deepclone(obj)

/*** 判斷資料型別

* 不考慮symbol型別

* @param obj

*/function judgetype(_obj)

/*** 基本資料型別判斷

* @param obj

*/function isbasedatatype(_obj)

/*** 陣列深拷貝

* @param _obj

* @param res

*/function _clonearry(_obj) else if (judgetype(value) === 'object') else if (judgetype(value) === 'array')

}return res;

}/**

* 物件深拷貝

* @param _obj

* @param res

*/function _cloneobj(_obj) ;

for (var attr in _obj) else if (judgetype(value) === 'object') else if (judgetype(value) === 'array')

}return res;

}if (judgetype(obj) === 'array') else

}

另外補充一句:object.assgin,這個介面真不是深拷貝,也是個不大不小的坑

js實現深拷貝

深拷貝 深拷貝本身只針對較為複雜的object型別資料,但是含義的話比如基本資料型別a和b的賦值操作,賦值之後b有自己的記憶體空間,a,b之間互不影響 淺拷貝 引用資料型別 名存在棧記憶體中,值存在於堆記憶體中,但是棧記憶體會提供乙個引用的位址指向堆記憶體中的值。當b a進行拷貝時,其實複製的是a的...

js實現深拷貝

var obj var newobj obj console.log newobj obj.number 2 console.log obj console.log newobj 發現此時newobj的number也變成了2,很顯然這不是我們想要的結果。往往我們開發專案中會大量用到賦值,卻發現之前原...

JS實現深拷貝

缺點 1 如果物件裡有函式,函式無法被拷貝下來 2 無法拷貝copyobj物件原型鏈上的屬性和方法 3 當資料的層次很深,會棧溢位 function deepcopy source 陣列相容 for var k in source else return target function isobje...