JavaScript数组与对象深拷贝的多种实现方案解析

作者:异步漫步时间:2026-10-22 15:53:29浏览:535

本文详细解析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程序设计师有所帮助。

作者最新文章