JavaScript数组与对象深拷贝的多种实现方案解析
本文详细解析JavaScript中浅拷贝与深拷贝的区别,通过赋值运算符说明浅拷贝的引用问题。重点介绍了利用for循环、slice、concat、ES6扩展运算符、JSON转换及通用递归函数等多种方式实现数组和对象的深拷贝,帮助开发者避免数据修改时的副作用。
JavaScript深浅拷贝概述
本文详细介绍JavaScript中实现浅拷贝与深拷贝的具体方法,供读者参考学习。
在日常开发中进行数组复制时,通常直接使用等号赋值,这种方式仅属于浅拷贝,可能引发诸多潜在问题。例如:
浅拷贝的副作用示例
let arr = [1,2,3,4,5];
let arr2 = arr;
console.log(arr) //[1, 2, 3, 4, 5]
console.log(arr2) //[1, 2, 3, 4, 5]
arr[0] = 6;
console.log(arr) //[6, 2, 3, 4, 5]
console.log(arr2) //[6, 2, 3, 4, 5]
arr2[4] = 7;
console.log(arr) //[6, 2, 3, 4, 7]
console.log(arr2) //[6, 2, 3, 4, 7]
从上述示例可以看出,在浅拷贝模式下,源数组与拷贝后的数组会相互影响。因此,需要采用一种互不干扰的复制方式,即深拷贝。
实现深拷贝的技术手段多种多样。
一、使用for循环实现深拷贝
数组深拷贝实现方案
//for循环copy
function copy(arr) {
let cArr = []
for(let i = 0; i < arr.length; i++){
cArr.push(arr[i])
}
return cArr;
}
let arr3 = [1,2,3,4];
let arr4 = copy(arr3) //[1,2,3,4]
console.log(arr4) //[1,2,3,4]
arr3[0] = 5;
console.log(arr3) //[5,2,3,4]
console.log(arr4) //[1,2,3,4]
二、利用slice方法实现深拷贝
//slice实现深拷贝
let arr5 = [1,2,3,4];
let arr6 = arr5.slice(0);
arr5[0] = 5;
console.log(arr5); //[5,2,3,4]
console.log(arr6); //[1,2,3,4]
三、通过concat方法实现深拷贝
//concat实现深拷贝
let arr7 = [1,2,3,4];
let arr8 = arr7.concat();
arr7[0] = 5;
console.log(arr7); //[5,2,3,4]
console.log(arr8); //[1,2,3,4]
四、采用ES6扩展运算符实现深拷贝
//es6扩展运算实现深拷贝
let arr9 = [1,2,3,4];
let [...arr10] = arr9;
arr9[0] = 5;
console.log(arr9) //[5,2,3,4]
console.log(arr10) //[1,2,3,4]
五、针对对象的循环深拷贝
对象深拷贝实现方案
// 循环copy对象
let obj = {
id:'0',
name:'king',
sex:'man'
}
let obj2 = copy2(obj)
function copy2(obj) {
let cObj = {};
for(var key in obj){
cObj[key] = obj[key]
}
return cObj
}
console.log(obj) //{id: "0", name: "king", sex: "man"}
console.log(obj2) //{id: "0", name: "king", sex: "man"}
六、将对象转换为JSON字符串实现深拷贝
//转换成json
let obj3 = JSON.parse(JSON.stringify(obj));
console.log(obj3) //{id: "0", name: "king", sex: "man"}
七、使用ES6扩展运算符进行对象深拷贝
let {...obj4}= obj
console.log(obj4) //{id: "0", name: "king", sex: "man"}
八、通用深拷贝函数实现
通用深拷贝函数
var clone = function (v) {
var o = v.constructor === Array ? [] : {};
for(var i in v){
o[i] = typeof v[i] === "object" ? clone(v[i]) : v[i];
}
return o;
}
总结:深入理解JavaScript中的深浅拷贝机制,能够灵活运用数组操作,并有效规避各类潜在Bug。
如需了解更多JavaScript相关知识,可参考本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》。
希望本文所述内容能对各位JavaScript程序设计师有所帮助。
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
相关标签:
