Aug
30
2024
js复制对象(深度拷贝,深拷贝)
作者:
绝缘体.. 发布:
2024-08-30 09:55 分类:
未分类 阅读:
抢沙发
js复制对象(深度拷贝,深拷贝)。
在 JavaScript 中,深度复制(deep copy)一个对象意味着创建一个新对象,其中所有的嵌套对象和数组都被递归复制,而不是简单地复制它们的引用。这里有几种常见的实现深度复制的方法:
1. 使用 JSON.parse 和 JSON.stringify
这是最简单的方法,但有一些限制,例如它不能复制函数、undefined、Date 对象、RegExp 对象等。
const original = { a: 1, b: { c: 2 } };
const copy = JSON.parse(JSON.stringify(original));
console.log(copy); // { a: 1, b: { c: 2 } }
2. 使用递归手动复制
可以通过递归函数手动深度复制对象,这样可以处理更复杂的情况,包括数组、对象嵌套等。
function deepCopy(obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}
if (Array.isArray(obj)) {
const arrCopy = [];
for (let i = 0; i < obj.length; i++) {
arrCopy[i] = deepCopy(obj[i]);
}
return arrCopy;
}
const objCopy = {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
objCopy[key] = deepCopy(obj[key]);
}
}
return objCopy;
}
const original = { a: 1, b: { c: 2 }, d: [3, 4] };
const copy = deepCopy(original);
console.log(copy); // { a: 1, b: { c: 2 }, d: [3, 4] }
3. 使用 lodash 库的 cloneDeep 方法
lodash 是一个强大的 JavaScript 工具库,它的 cloneDeep 方法可以方便地进行深度复制。
const _ = require('lodash');
const original = { a: 1, b: { c: 2 }, d: [3, 4] };
const copy = _.cloneDeep(original);
console.log(copy); // { a: 1, b: { c: 2 }, d: [3, 4] }
4. 使用 structuredClone 方法
structuredClone 是现代浏览器中内置的 API,用于深度复制对象,它能够处理许多数据类型,例如 Date 对象、RegExp 对象、Map、Set 等。
const original = { a: 1, b: { c: 2 }, d: new Date() };
const copy = structuredClone(original);
console.log(copy); // { a: 1, b: { c: 2 }, d: [Date object] }
总结
对于简单对象,JSON.parse 和 JSON.stringify 是一个简单的解决方案。
对于包含特殊数据类型(如 Date、RegExp、Map 等)的对象,推荐使用 structuredClone,或者使用 lodash 的 cloneDeep 方法。
手动递归复制提供了完全的控制权,但需要编写更多的代码。
微信扫一扫,打赏作者吧~