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 方法。
手动递归复制提供了完全的控制权,但需要编写更多的代码。