共计 883 个字符,预计需要花费 3 分钟才能阅读完成。
最近在研究 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 不是深拷贝