JS 中深拷貝的幾種實(shí)現(xiàn)方法
1、使用遞歸的方式實(shí)現(xiàn)深拷貝
//使用遞歸的方式實(shí)現(xiàn)數(shù)組、對(duì)象的深拷貝
function deepClone1(obj) {
//判斷拷貝的要進(jìn)行深拷貝的是數(shù)組還是對(duì)象,是數(shù)組的話進(jìn)行數(shù)組拷貝,對(duì)象的話進(jìn)行對(duì)象拷貝
var objClone = Array.isArray(obj) ? [] : {};
//進(jìn)行深拷貝的不能為空,并且是對(duì)象或者是
if (obj && typeof obj === "object") {
for (key in obj) {
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone1(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
2、通過(guò) JSON 對(duì)象實(shí)現(xiàn)深拷貝
//通過(guò)js的內(nèi)置對(duì)象JSON來(lái)進(jìn)行數(shù)組對(duì)象的深拷貝
function deepClone2(obj) {
var _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone;
}
JSON對(duì)象實(shí)現(xiàn)深拷貝的一些問(wèn)題
* 無(wú)法實(shí)現(xiàn)對(duì)對(duì)象中方法的深拷貝
3、通過(guò)jQuery的extend方法實(shí)現(xiàn)深拷貝
var array = [1,2,3,4];
var newArray = $.extend(true,[],array);
4、Object.assign()拷貝
當(dāng)對(duì)象中只有一級(jí)屬性,沒(méi)有二級(jí)屬性的時(shí)候,此方法為深拷貝,但是對(duì)象中有對(duì)象的時(shí)候,此方法,在二級(jí)屬性以后就是淺拷貝。
5、lodash函數(shù)庫(kù)實(shí)現(xiàn)深拷貝
lodash很熱門(mén)的函數(shù)庫(kù),提供了 lodash.cloneDeep()實(shí)現(xiàn)深拷貝