核心概念

  1. 浅拷贝(Shallow Copy):仅复制对象的第一层属性,引用类型属性共享内存地址
  2. 深拷贝(Deep Copy):递归复制对象所有层级,新旧对象完全独立

常见实现方式

浅拷贝方法

// 1. Object.assign
const copy1 = Object.assign({}, original)

// 2. 展开运算符
const copy2 = {...original}

// 3. Array.prototype.slice
const arrCopy = arr.slice()

深拷贝方法

// 1. JSON 序列化(有局限性)
const deepCopy1 = JSON.parse(JSON.stringify(original))

// 2. 递归实现
function deepClone(obj, map = new WeakMap()) {
if (typeof obj !== 'object' || obj === null) return obj
if (map.has(obj)) return map.get(obj)

const clone = Array.isArray(obj) ? [] : {}
map.set(obj, clone)

for (const key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key], map)
}
}
return clone
}

// 3. 第三方库(如 lodash.cloneDeep)

核心区别

特性 浅拷贝 深拷贝
拷贝层级 仅第一层 所有嵌套层级
引用类型处理 共享内存地址 创建新内存空间
常用方法 Object.assign/展开运算符 JSON/递归/lodash
性能影响 慢(尤其大数据量)
应用场景 简单对象复制 需要完全独立的对象副本

注意事项

  1. JSON方法无法处理函数、Symbol、循环引用
  2. 递归实现需处理循环引用(使用WeakMap)
  3. 特殊对象类型(Date/RegExp等)需要单独处理
  4. 深拷贝可能影响性能(大数据量时)
  5. 函数属性在不同实现中的处理方式不同

使用场景

  1. 浅拷贝:配置项共享、简单状态管理
  2. 深拷贝:状态快照、不可变数据、避免副作用