对于一个对象深拷贝,可以使用JSON来做:
let obj_init = {
person: {
name: "tf",
age: 22
},
arr: [
{
id: 1,
name: "play",
arr: [1, 2]
},
["t", "f"]
],
index: "1",
other: null
};
// type 1
let obj_copy1 = JSON.parse(JSON.stringify(obj_init));
console.log(obj_init.person === obj_copy1.person); // false
console.log(obj_init.arr[0] === obj_copy1.arr[0]); // false
用递归的方法也可以实现
let deep_copy = function f(obj) {
let new_value;
if(typeof obj === 'object' && obj != null){
if(obj instanceof Array){
new_value = [];
for(let i=0;i<obj.length;i++){
if(typeof obj[i] !== 'object' || obj[i] === null){
new_value[i] = obj[i];
}else{
new_value.push(f(obj[i]));
}
}
}else{
new_value = {};
for(let item in obj){
if(obj.hasOwnProperty(item)){
if(typeof obj[item] !== 'object' || obj[item] === null){
new_value[item] = obj[item];
}else{
Object.assign(new_value, { [item]: f(obj[item])});
}
}
}
}
}else{
new_value = obj;
}
return new_value;
};
let obj_copy2 = deep_copy(obj_init);
console.log(obj_copy2.person === obj_init.person); // false
console.log(obj_copy2.arr[0] === obj_init.arr[0]); // false
因为在严格模式下,不可以使用arguments.callee,所以这里采用了一个变量函数的方法并且等式右边不是匿名函数。