浅拷贝(Shallow Copy):
浅拷贝只复制对象的第一层属性,如果对象的属性是引用类型(比如数组、对象),则只会复制引用而不是实际的值。常见的浅拷贝方法包括Object.assign()和展开运算符...。
Object.assign():
1
2const original = { a: 1, b: { c: 2 } };
const shallowCopy = Object.assign({}, original);展开运算符(…):
1
2const original = { a: 1, b: { c: 2 } };
const shallowCopy = { ...original };Array.slice():
对于数组,使用
slice()方法也可以实现浅拷贝。1
2const originalArray = [1, 2, 3];
const shallowCopyArray = originalArray.slice();Array.concat():
另一个数组的浅拷贝方法是使用
concat()方法。1
2const originalArray = [1, 2, 3];
const shallowCopyArray = originalArray.concat();
深拷贝(Deep Copy):
深拷贝会递归地复制所有层级的对象属性,确保新对象的每个值都是原始对象值的副本,而不是对同一引用的引用。
JSON.parse() 和 JSON.stringify():
使用
JSON.parse()和JSON.stringify()结合可以实现简单的深拷贝,但无法处理循环引用以及特殊对象。1
2const original = { a: 1, b: { c: 2 } };
const deepCopy = JSON.parse(JSON.stringify(original));使用第三方库:
第三方库如 Lodash 提供了更完善和高效的深拷贝方法。
1
2
3const _ = require("lodash");
const original = { a: 1, b: { c: 2 } };
const deepCopy = _.cloneDeep(original);自定义递归函数:
可以编写自定义递归函数来处理深拷贝,能够更灵活地控制拷贝过程。
1
2
3
4
5
6
7
8
9
10function deepCopy(obj) {
if (typeof obj !== "object" || obj === null) {
return obj;
}
const newObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
newObj[key] = deepCopy(obj[key]);
}
return newObj;
}
选择深拷贝还是浅拷贝取决于具体的需求。在处理简单的数据结构时,浅拷贝通常足够;但在需要完全独立的副本、或者处理复杂嵌套对象时,则需要深拷贝。不同的场景可能需要使用不同的拷贝方式。