如何區(qū)分深拷貝與淺拷貝器瘪,簡單點來說又谋,就是假設B復制了A,當修改A時娱局,看B是否會發(fā)生變化,如果B也跟著變了咧七,說明這是淺拷貝衰齐,拿人手短,如果B沒變继阻,那就是深拷貝耻涛,自食其力废酷。
怎么去實現(xiàn)?抹缕?澈蟆??卓研?趴俘??奏赘?寥闪??磨淌?疲憋??梁只?缚柳?
1.JSON方法實現(xiàn)
//_tmp和result是相互獨立的,沒有任何聯(lián)系搪锣,有各自的存儲空間秋忙。
let deepClone = function (obj) {
let _tmp = JSON.stringify(obj);//將對象轉(zhuǎn)換為json字符串形式
let result = JSON.parse(_tmp);//將轉(zhuǎn)換而來的字符串轉(zhuǎn)換為原生js對象
return result;
};
let obj1 = {
weiqiujaun: {
age: 20,
class: 1502
},
liuxiaotian: {
age: 21,
class: 1501
}
};
let test = deepClone(obj1);
console.log(test);
2.用for…in實現(xiàn)遍歷和復制
function deepClone(obj) {
let result = typeof obj.splice === "function" ? [] : {};
if (obj && typeof obj === 'object') {
for (let key in obj) {
if (obj[key] && typeof obj[key] === 'object') {
result[key] = deepClone(obj[key]);//如果對象的屬性值為object的時候,遞歸調(diào)用deepClone,即在吧某個值對象復制一份到新的對象的對應值中淤翔。
} else {
result[key] = obj[key];//如果對象的屬性值不為object的時候翰绊,直接復制參數(shù)對象的每一個鍵值到新的對象對應的鍵值對中。
}
}
return result;
}
return obj;
}
let testArray = ["a", "b", "c", "d"];
let testRes = deepClone(testArray);
console.log(testRes);
console.log(typeof testRes[1]);
let testObj = {
name: "weiqiujuan",
sex: "girl",
age: 22,
favorite: "play",
family: {brother: "son", mother: "haha", father: "heihei"}
};
let testRes2 = deepClone(testObj);
testRes2.family.brother = "weibo";
console.log(testRes2);
3.利用數(shù)組的Array.prototype.forEach進copy
let deepClone = function (obj) {
let copy = Object.create(Object.getPrototypeOf(obj));
let propNames = Object.getOwnPropertyNames(obj);
propNames.forEach(function (items) {
let item = Object.getOwnPropertyDescriptor(obj, items);
Object.defineProperty(copy, items, item);
});
return copy;
};
let testObj = {
name: "weiqiujuan",
sex: "girl",
age: 22,
favorite: "play",
family: {brother: "wei", mother: "haha", father: "heihei"}
}
let testRes2 = deepClone(testObj);
console.log(testRes2);
4.淺拷貝(使用object.assign方法)
let target=[];
let testArr=[2,3,5,8];
Object.assign(target,testArr);
console.log(target);
testArr.push(8);
console.log("我是原來的"+target+",我是現(xiàn)在的"+testArr);
5旁壮、lodash函數(shù)庫實現(xiàn)深拷貝
lodash很熱門的函數(shù)庫监嗜,提供了 lodash.cloneDeep()實現(xiàn)深拷貝 ??傳送門https://www.lodashjs.com/
參考:聽風是風