JavaScript:深克隆与浅克隆完全指南
内容提要
浅克隆是创建新对象并复制原对象属性的方法,常用Object.assign()、扩展运算符和数组方法(如slice和concat)。深克隆则创建新引用,常用JSON.stringify()和Lodash的_.cloneDeep方法。structuredClone()是原生API,适合深度复制复杂数据结构。
关键要点
-
浅克隆是创建新对象并复制原对象属性的方法,主要使用Object.assign()、扩展运算符和数组方法(如slice和concat)。
-
Object.assign()方法用于复制对象,支持浅复制和一维对象的深复制。
-
扩展运算符可以在构造字面量对象时复制属性,语法为let cloneObj = {...obj};。
-
数组方法slice()和concat()可以用于浅复制数组,slice()返回选定元素,concat()合并数组。
-
深克隆创建新引用,常用JSON.stringify()和Lodash的_.cloneDeep方法。
-
JSON.stringify()和JSON.parse()组合可以实现深复制,但会丢失函数、undefined、Date、RegExp等类型。
-
Lodash的_.cloneDeep方法提供了深复制的功能,支持多种数据类型。
-
structuredClone()是原生API,适合深度复制复杂数据结构,支持多种JavaScript数据类型,但不支持函数和循环引用。
-
手动实现深克隆需要处理各种边界情况,使用structuredClone()可以简化这一过程。
延伸问答
什么是浅克隆,它是如何实现的?
浅克隆是创建新对象并复制原对象属性的方法,常用Object.assign()、扩展运算符和数组方法(如slice和concat)实现。
深克隆与浅克隆有什么区别?
深克隆创建新引用并复制所有嵌套对象,而浅克隆只复制对象的第一层属性,引用类型的属性仍指向原对象。
如何使用JSON.stringify()实现深克隆?
可以通过JSON.stringify()将对象序列化为JSON字符串,然后使用JSON.parse()将其反序列化为新对象,从而实现深克隆。
Lodash的_.cloneDeep方法有什么优势?
Lodash的_.cloneDeep方法支持多种数据类型的深复制,能够处理复杂对象,避免手动实现深克隆的复杂性。
structuredClone()函数的特点是什么?
structuredClone()是原生API,支持深度复制复杂数据结构,能够处理多种JavaScript数据类型,但不支持函数和循环引用。
手动实现深克隆时需要注意哪些问题?
手动实现深克隆时需处理边界情况,如循环引用、特殊对象类型(如Date、RegExp)等,使用WeakMap可以避免循环引用问题。