js 克隆
对象通过引用被赋值和拷贝。换句话说,一个变量存储的不是“对象的值”,而是一个对值的“引用”(内存地址)。因此,拷贝此类变量或将其作为函数参数传递时,所拷贝的是引用,而不是对象本身。
所有通过被拷贝的引用的操作(如添加、删除属性)都作用在同一个对象上。
为了创建“真正的拷贝”(一个克隆),我们可以使用 Object.assign 来做所谓的“浅拷贝”(嵌套对象被通过引用进行拷贝)或者使用“深拷贝”函数,例如 _.cloneDeep(obj)。
更多描述见对象的引用和复制
手写深克隆
function deepClone(obj) {
// 如果转入参数非引用类型,咋返回本身
if (typeof obj !== 'object' || typeof obj == null) {
return obj;
}
let result;
// 初始化result
if (obj instanceof Array) {
result = [];
} else {
result = {};
}
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key]);
}
}
return result;
}
// 测试使用
const obj1 = {
name: '小明',
address: {
a: 1,
b: 2,
},
arr: [2, 3, 4, 5, 6],
};
const obj2 = deepClone(obj1);
obj1.name = '323';
console.log(obj2);