- 浅克隆
- Object.assign()
浅拷贝
const target = { a: 1, b: 2 };
const source = { b: 3, c: 4 };
const source2 = { c: 5, d: 6 };
const currentTarget = Object.assign(target, source, source2);
console.log(currentTarget);
// currentTarget: {a: 1, b: 3, c: 5, d: 6}
解构(es6)
//对象的结构
let obj={name:'张三',age:'32'}
let {age,name}=obj
//数组的结构
let arr=[88,99,10,33]
let arr1=[...arr] //arr1将为[88,99,10,33]
- 深克隆
- 递归
function deepClone(oldObj){
if(oldObj==null){
return null
};
if(typeof oldObj!=="object"){
return oldObj
};
let newObj=Array.isArray(oldObj)?[]:{};
for (const key in oldObj) {
newObj[key]=deepClone(oldObj[key]);
};
return newObj;
}
- JSON
function deepClone2(obj) {
let _obj = JSON.stringify(obj),
return JSON.parse(_obj);
}
问题:
1. 无法实现对函数、RegExp等特殊对象的克隆(会在JSON.stringify阶段被直接忽略)
2. 会抛弃对象的constructor,所有构造函数会指向Object
3. 对象有循环引用,会报错;