最近在研究js物件的深拷貝,下面是我試驗的兩種方法,一種是通過JSON.stringify和JSON.parse的方法實現的深拷貝,一種是通過遞迴函式實現的深拷貝。
此處有個問題,第二種方法實現了物件方法的拷貝,但是不是深拷貝,網上找了很久都沒有找到實現物件的方法深拷貝的方法,希望有大神能給點建議。
let obj = {
a: 1,
b: `2`,
c: {
c1: 1
},
d: function () {
console.log(`d`);
},
e: [1, 2, 3]
};
//使用JSON.parse和JSON.stringify的方法是深拷貝,除了function,其他的都能拷貝
let obj_copy1 = JSON.parse(JSON.stringify(obj));
console.log(obj_copy1);
console.log(obj.c === obj_copy1.c); //結果是false,物件是深拷貝
// 使用遞迴的方法複製,function可以複製,除了function是淺拷貝,其他的都是深拷貝
function clone(obj) {
let new_obj = {};
for(let key in obj) {
let t = ( typeof obj[key] ).toLowerCase();
if (t === `object`) {
if(obj[key] instanceof Array) {
var new_arr = [];
for(let item of obj[key]) {
new_arr.push(item);
}
new_obj[key] = new_arr;
} else {
new_obj[key] = clone(obj[key]);
}
} else {
new_obj[key] = obj[key];
}
}
return new_obj;
}
let obj_copy2 = clone(obj);
console.log(obj_copy2);
console.log(obj.c === obj_copy2.c); //結果是false,物件是深拷貝
console.log(obj.d === obj_copy2.d); //結果是true,function不是深拷貝