如何实现JavaScript中的深拷贝与浅拷贝技巧?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1051个文字,预计阅读时间需要5分钟。
JavaScript中的浅拷贝(shallow copy)仅复制对象或数组的顶层属性,对于嵌套的引用类型(如对象、数组)仅复制指针,新旧对象共享同一块内存。常见错误包括使用Object.assign()或展开运算符[...arr],这只能完全隔离数据,修改深层属性时,原始数据也会被意外改变。
适用场景:只需隔离顶层字段,且确定内部结构不会被后续修改;或作为性能敏感场景下的临时方案。
-
Object.assign({}, obj)对对象有效,但不处理null、undefined或原型链 -
[...arr]或Array.from(arr)适合一维数组,对含对象的数组无效 -
structuredClone()是现代浏览器推荐方式,但目前不支持函数、undefined、Symbol和循环引用
深拷贝必须递归或序列化处理嵌套结构
真正意义上的深拷贝需确保所有层级的引用类型都生成独立副本。没有银弹方案,选择取决于环境限制和数据特征。
最稳妥的手写递归实现要处理:null、日期、正则、数组、普通对象、Map/Set 等类型,还要避免循环引用导致栈溢出。但多数项目中,更倾向用成熟方案降低维护成本。
本文共计1051个文字,预计阅读时间需要5分钟。
JavaScript中的浅拷贝(shallow copy)仅复制对象或数组的顶层属性,对于嵌套的引用类型(如对象、数组)仅复制指针,新旧对象共享同一块内存。常见错误包括使用Object.assign()或展开运算符[...arr],这只能完全隔离数据,修改深层属性时,原始数据也会被意外改变。
适用场景:只需隔离顶层字段,且确定内部结构不会被后续修改;或作为性能敏感场景下的临时方案。
-
Object.assign({}, obj)对对象有效,但不处理null、undefined或原型链 -
[...arr]或Array.from(arr)适合一维数组,对含对象的数组无效 -
structuredClone()是现代浏览器推荐方式,但目前不支持函数、undefined、Symbol和循环引用
深拷贝必须递归或序列化处理嵌套结构
真正意义上的深拷贝需确保所有层级的引用类型都生成独立副本。没有银弹方案,选择取决于环境限制和数据特征。
最稳妥的手写递归实现要处理:null、日期、正则、数组、普通对象、Map/Set 等类型,还要避免循环引用导致栈溢出。但多数项目中,更倾向用成熟方案降低维护成本。

