JavaScript对象深拷贝、引用、克隆完整实战教程
本教程面向 JavaScript 新手及前端开发者,详细讲解对象深拷贝方法,包括基本拷贝、递归拷贝、JSON 方法、第三方库和结构化克隆 API。通过小标题分步骤讲解,让用户快速掌握深拷贝技巧,解决对象引用、数据共享、修改影响原对象等问题,提高代码安全性和可维护性。
JavaScript对象深拷贝方法教程(详细版)
一、浅拷贝与深拷贝区别
步骤:
浅拷贝只复制对象第一层属性,嵌套对象仍是引用
const obj1 = {a:1, b:{c:2}};
const shallow = {...obj1};
shallow.b.c = 10;
console.log(obj1.b.c); // 输出 10
深拷贝复制所有层级,互不影响
技巧:
理解对象引用和堆内存概念
浅拷贝适合简单对象,深拷贝适合复杂对象
二、JSON方法实现深拷贝
步骤:
const obj = {a:1, b:{c:2}};
const deepCopy = JSON.parse(JSON.stringify(obj));
deepCopy.b.c = 10;
console.log(obj.b.c); // 输出 2
技巧:
简单对象和数组适用
不支持函数、Symbol、undefined、循环引用
三、递归函数实现深拷贝
步骤:
function deepClone(obj) {
if(obj === null || typeof obj !== 'object') return obj;
if(Array.isArray(obj)) {
return obj.map(item => deepClone(item));
}
const clone = {};
for(let key in obj){
if(obj.hasOwnProperty(key)){
clone[key] = deepClone(obj[key]);
}
}
return clone;
}
const obj = {a:1, b:{c:2}};
const clone = deepClone(obj);
clone.b.c = 10;
console.log(obj.b.c); // 输出 2
技巧:
适用于嵌套对象、数组
可扩展支持 Set、Map、Date 类型
四、使用第三方库 Lodash
步骤:
import _ from 'lodash';
const obj = {a:1, b:{c:2}};
const clone = _.cloneDeep(obj);
技巧:
Lodash
cloneDeep支持大部分类型安全、高效、简洁,适合生产环境
五、结构化克隆 API(StructuredClone)
步骤:
const obj = {a:1, b:{c:2}};
const clone = structuredClone(obj);
技巧:
支持大部分 JS 类型,包括 Map、Set、Date
不支持函数、DOM 节点
浏览器和 Node.js 最新版本支持
六、常见问题解决
循环引用导致 JSON 方法失败 → 使用递归或第三方库
函数或 Symbol 丢失 → 使用递归函数或结构化克隆 API
数组或嵌套对象未克隆 → 检查拷贝方法是否处理嵌套
总结:
通过本教程,你可以系统掌握 JavaScript 对象深拷贝方法,包括 JSON 方法、递归函数、Lodash 库及结构化克隆 API。结合这些方法,新手也能安全处理复杂对象,避免修改原对象,提高代码可维护性和安全性。