当前位置:Gxlcms > JavaScript > JavaScript实现浅拷贝与深拷贝的方法分析

JavaScript实现浅拷贝与深拷贝的方法分析

时间:2021-07-01 10:21:17 帮助过:17人阅读

本文实例讲述了JavaScript实现浅拷贝与深拷贝的方法。分享给大家供大家参考,具体如下:

平时使用数组复制时,我们大多数会使用‘=',这只是浅拷贝,存在很多问题。比如

  1. let arr = [1,2,3,4,5];
  2. let arr2 = arr;
  3. console.log(arr) //[1, 2, 3, 4, 5]
  4. console.log(arr2) //[1, 2, 3, 4, 5]
  5. arr[0] = 6;
  6. console.log(arr) //[6, 2, 3, 4, 5]
  7. console.log(arr2) //[6, 2, 3, 4, 5]
  8. arr2[4] = 7;
  9. console.log(arr) //[6, 2, 3, 4, 7]
  10. console.log(arr2) //[6, 2, 3, 4, 7]

很明显,浅拷贝下,拷贝和被拷贝的数组会相互受到影响。所以,必须要有一种不受影响的方法,那就是深拷贝。

深拷贝的实现方式有很多种。

一、for循环实现深拷贝

  1. //for循环copy
  2. function copy(arr) {
  3. let cArr = []
  4. for(let i = 0; i < arr.length; i++){
  5. cArr.push(arr[i])
  6. }
  7. return cArr;
  8. }
  9. let arr3 = [1,2,3,4];
  10. let arr4 = copy(arr3) //[1,2,3,4]
  11. console.log(arr4) //[1,2,3,4]
  12. arr3[0] = 5;
  13. console.log(arr3) //[5,2,3,4]
  14. console.log(arr4) //[1,2,3,4]

二、slice方法实现深拷贝

  1. //slice实现深拷贝
  2. let arr5 = [1,2,3,4];
  3. let arr6 = arr5.slice(0);
  4. arr5[0] = 5;
  5. console.log(arr5); //[5,2,3,4]
  6. console.log(arr6); //[1,2,3,4]

三、concat实现深拷贝

  1. //concat实现深拷贝
  2. let arr7 = [1,2,3,4];
  3. let arr8 = arr7.concat();
  4. arr7[0] = 5;
  5. console.log(arr7); //[5,2,3,4]
  6. console.log(arr8); //[1,2,3,4]

四、es6扩展运算实现深拷贝

  1. //es6扩展运算实现深拷贝
  2. let arr9 = [1,2,3,4];
  3. let [...arr10] = arr9;
  4. arr9[0] = 5;
  5. console.log(arr9) //[5,2,3,4]
  6. console.log(arr10) //[1,2,3,4]

五、对象的循环深拷贝

  1. // 循环copy对象
  2. let obj = {
  3. id:'0',
  4. name:'king',
  5. sex:'man'
  6. }
  7. let obj2 = copy2(obj)
  8. function copy2(obj) {
  9. let cObj = {};
  10. for(var key in obj){
  11. cObj[key] = obj[key]
  12. }
  13. return cObj
  14. }
  15. console.log(obj) //{id: "0", name: "king", sex: "man"}
  16. console.log(obj2) //{id: "0", name: "king", sex: "man"}

六、对象转换成json实现深拷贝

  1. //转换成json
  2. let obj3 = JSON.parse(JSON.stringify(obj));
  3. console.log(obj3) //{id: "0", name: "king", sex: "man"}

七、es6扩展运算实现深拷贝

  1. let {...obj4}= obj
  2. console.log(obj4) //{id: "0", name: "king", sex: "man"}

八、通用深拷贝

  1. var clone = function (v) {
  2. var o = v.constructor === Array ? [] : {};
  3. for(var i in v){
  4. o[i] = typeof v[i] === "object" ? clone(v[i]) : v[i];
  5. }
  6. return o;
  7. }

总结:深刻理解javascript的深浅拷贝,可以灵活的运用数组,并且可以避免很多bug。

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

人气教程排行