2026-10-23 06:06:31
在 JavaScript 中,深拷贝是指创建一个新对象,完全复制原始对象的所有属性和嵌套对象,确保新对象与原始对象完全独立。以下是几种实现深拷贝的方法及其详细说明:
1. 使用 JSON 方法(简单但有局限)const deepCopy = JSON.parse(JSON.stringify(obj));特点:
无法处理函数、undefined、Symbol、循环引用。
会丢失对象的原型链和特殊类型(如 Date、RegExp 会被转为字符串或空对象)。
示例:
const obj = { a: 1, b: { c: 2 } };const copy = JSON.parse(JSON.stringify(obj));copy.b.c = 3;console.log(obj.b.c); // 2(原对象未受影响)2. 递归实现深拷贝(推荐)通过递归遍历对象属性,手动复制每一层数据:
function deepClone(obj, hash = new WeakMap()) { // 处理基本类型和 null/undefined if (obj === null || typeof obj !== 'object') return obj; // 处理循环引用 if (hash.has(obj)) return hash.get(obj); // 处理 Date 和 RegExp if (obj instanceof Date) return new Date(obj); if (obj instanceof RegExp) return new RegExp(obj); // 创建新对象或数组 const clone = Array.isArray(obj) ? [] : {}; hash.set(obj, clone); // 记录已拷贝对象 // 递归拷贝属性 for (const key in obj) { if (obj.hasOwnProperty(key)) { clone[key] = deepClone(obj[key], hash); } } return clone;}特点:
支持循环引用(通过 WeakMap 记录已拷贝对象)。
保留对象原型链和特殊类型(如 Date、RegExp)。
代码较复杂,需处理多种边界情况。
示例:
const obj = { a: 1, b: { c: 2 } };const copy = deepClone(obj);copy.b.c = 3;console.log(obj.b.c); // 23. 使用第三方库支持大多数类型(包括 Date、RegExp),但无法拷贝函数和原型链。
通过合理选择方法,可以确保深拷贝的准确性和性能。