JavaScript的深拷贝实现

大神们在线说明下,JavaScript的深拷贝实现
最新回答
黛眉浅淡

2026-10-26 23:13:57

JavaScript中的深拷贝可以通过多种方式实现,每种方法都有其优缺点和适用场景。以下是几种常见的实现方法及其详细说明:

1. JSON方法

使用JSON.parse()和JSON.stringify()是最简单的深拷贝方法,但有其局限性。

function jsonClone(obj) { return JSON.parse(JSON.stringify(obj));}var original = { a: 1, b: { c: 2 } };var cloned = jsonClone(original);

优点:

  • 简单易用。
  • 适用于大多数简单对象。

缺点:

  • 无法处理函数、undefined、Symbol、循环引用等。
  • 会忽略对象的原型链。
2. 递归拷贝

通过递归遍历对象的所有属性,逐个进行拷贝,可以处理嵌套对象和数组。

function deepClone(obj, hash = new WeakMap()) { if (obj === null || typeof obj !== 'object') { return obj; } if (hash.has(obj)) { return hash.get(obj); } let clone; if (obj instanceof Date) { clone = new Date(obj); } else if (obj instanceof RegExp) { clone = new RegExp(obj); } else if (Array.isArray(obj)) { clone = []; hash.set(obj, clone); obj.forEach((item, index) => { clone[index] = deepClone(item, hash); }); } else { clone = Object.create(Object.getPrototypeOf(obj)); hash.set(obj, clone); for (let key in obj) { if (obj.hasOwnProperty(key)) { clone[key] = deepClone(obj[key], hash); } } } return clone;}var original = { a: 1, b: { c: 2 } };var cloned = deepClone(original);

优点:

  • 可以处理大多数数据类型,包括对象、数组、日期、正则表达式等。
  • 使用WeakMap处理循环引用,避免无限递归。

缺点:

  • 代码相对复杂。
  • 无法处理函数和Symbol属性。
3. 使用第三方库

一些成熟的第三方库提供了深拷贝功能,如Lodash的_.cloneDeep()。

var _ = require('lodash');var original = { a: 1, b: { c: 2 } };var cloned = _.cloneDeep(original);

优点:

  • 功能强大,经过充分测试。
  • 可以处理各种复杂情况,包括循环引用。

缺点:

  • 需要引入额外的库。
4. 使用structuredClone(现代浏览器支持)

structuredClone是现代浏览器提供的原生深拷贝方法。

var original = { a: 1, b: { c: 2 } };var cloned = structuredClone(original);

优点:

  • 原生支持,性能较好。
  • 可以处理大多数数据类型,包括循环引用。

缺点:

  • 兼容性问题,不支持IE。
总结
  • 简单对象:使用JSON方法。
  • 复杂对象:使用递归拷贝或structuredClone。
  • 生产环境:推荐使用Lodash的_.cloneDeep()。
  • 现代浏览器:优先考虑structuredClone。

选择哪种方法取决于具体的使用场景和需求。