浅拷贝是指仅仅复制对象的引用,而不是复制对象本身;深拷贝则是把复制对象所引用的全部对象都复制一遍

补充

补充:浅拷贝只复制一层引用,新对象与原对象共享内层引用,修改内层数据会互相影响;深拷贝会递归复制所有层级的数据,得到一个完全独立的对象。常见实现方式:

  • 浅拷贝 :Object.assign({}, src)、{...src}、手写循环赋值、Array.prototype.slice 等。
  • 深拷贝 :
    • JSON 方案:JSON.parse(JSON.stringify(obj)),简单但无法处理函数 / 循环引用 / Date / RegExp / Symbol / undefined 等;
    • structuredClone():现代浏览器原生深拷贝,支持循环引用、Date、Map、Set 等,但不支持函数;
    • 递归手写 / Lodash cloneDeep:通用、可处理函数和循环引用。
// 浅拷贝
const a = { x: 1, info: { name: 'foo' } }
const b = { ...a }
b.info.name = 'bar'
console.log(a.info.name) // 'bar'(共享内层引用)

// 深拷贝
const c = structuredClone(a)
c.info.name = 'baz'
console.log(a.info.name) // 'bar'(完全独立)

来源整理自:vue3js.cn 面试官系列