JavaScript 对象数组的深浅拷贝
发布时间:2023-06-29 16:46:00
发布人:zyh
在 JavaScript 中,对象数组的拷贝涉及到深拷贝和浅拷贝的概念。下面简要介绍这两种拷贝方式:
1. 浅拷贝:
- 浅拷贝是指创建一个新的对象或数组,新对象的属性值是对原始对象属性的引用。也就是说,新对象和原始对象的某些属性引用相同的内存地址。
- 对于对象数组的浅拷贝,可以使用扩展运算符 `...` 或 `Array.from()` 方法。
const originalArray = [{ name: "John" }, { name: "Jane" }];
// 使用扩展运算符进行浅拷贝
const shallowCopyArray1 = [...originalArray];
shallowCopyArray1[0].name = "Mike";
console.log(originalArray[0].name); // 输出: Mike
// 使用 Array.from() 进行浅拷贝
const shallowCopyArray2 = Array.from(originalArray);
shallowCopyArray2[1].name = "Lily";
console.log(originalArray[1].name); // 输出: Lily
2. 深拷贝:
- 深拷贝是指创建一个全新的对象或数组,新对象和原始对象完全独立,不存在属性引用共享的情况。
- 对于对象数组的深拷贝,可以使用 JSON 序列化和反序列化方法,即 `JSON.stringify()` 和 `JSON.parse()`。
const originalArray = [{ name: "John" }, { name: "Jane" }];
// 使用 JSON 序列化和反序列化进行深拷贝
const deepCopyArray = JSON.parse(JSON.stringify(originalArray));
deepCopyArray[0].name = "Mike";
console.log(originalArray[0].name); // 输出: John
需要注意的是,使用 JSON 序列化和反序列化方法进行深拷贝时,有一些限制:
- 无法复制函数、正则表达式等特殊对象。
- 无法处理循环引用的情况。
如果需要处理更复杂的对象结构或者遇到上述限制,可以考虑使用第三方库(如 lodash 的 `cloneDeep` 方法)来实现更可靠的深拷贝。