在 JavaScript 中,可以使用浅拷贝和深拷贝来复制对象。
浅拷贝只复制对象的一层属性,如果属性值是对象,则只复制该属性的引用而不是实际的对象。
可以使用 Object.assign()
方法、展开运算符或数组的 slice()
和 concat()
方法来实现浅拷贝。
// 使用 Object.assign() 方法实现浅拷贝
const obj = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, obj);
shallowCopy.b.c = 3;
console.log(obj.b.c); // 输出 3
// 使用展开运算符实现浅拷贝
const obj2 = { a: 1, b: { c: 2 } };
const shallowCopy2 = { ...obj2 };
shallowCopy2.b.c = 3;
console.log(obj2.b.c); // 输出 3
深拷贝会复制对象的所有属性,包括属性值是对象的情况。因此,深拷贝会创建一个新的对象,不会与原对象共享引用。
可以使用递归、JSON.parse()
和 JSON.stringify()
方法来实现深拷贝。但是,使用 JSON.parse()
和 JSON.stringify()
方法进行深拷贝需要注意,因为它们不能序列化函数、循环引用和特殊的对象(例如 Date
、RegExp
)。
// 使用递归实现深拷贝
function deepCopy(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
const newObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepCopy(obj[key]);
}
}
return newObj;
}
const obj3 = { a: 1, b: { c: 2 } };
const deepCopy3 = deepCopy(obj3);
deepCopy3.b.c = 3;
console.log(obj3.b.c); // 输出 2
console.log(deepCopy3.b.c); // 输出 3
需要注意的是,深拷贝会比浅拷贝慢并且消耗更多的内存,因此在处理大型对象时应该谨慎使用深拷贝。