JS深浅拷贝

2021-07-22  本文已影响0人  王果果

原网址:https://www.cnblogs.com/dengyao-blogs/p/11466598.html

1:深拷贝只是从源数据中拷贝一份出来进行操作,而不是改变源数据;改变源数据的那是浅拷贝;
2:原生js方法slice、concat都不是真正意义上的深拷贝,都仅只适用于一维数组,拷贝的属性不够彻底;
3:实现js深拷贝我们可以通过JSON.parse(JSON.stringify())、递归以及JQuery库的extend方法来实现;

基本类型复制:

var a = 1;
var b = a;//复制
console.log(b)//1
a = 2;//改变a的值
console.log(b)//1
console.log(a) //2

引用类型复制:


js的浅拷贝

var arr1 = ['red','green'];
var arr2 = arr1;      //复制
console.log(arr2)   //['red','green'];
arr1.push('black') ;   //改变color1的值
console.log(arr2)    //['red','green','black']
console.log(arr1)    //["red", "green", "black"]

var arr1 = ['red','green'];
var arr2 = arr1.slice(0);//复制
console.log(arr2)//['red','green'];
arr1.push('black') ;//改变color1的值
console.log(arr2)//["red", "green"]
console.log(arr1)//["red", "green", "black"]
var arr1=[1,2,3,['1','2','3']];
var arr2=arr1.slice(0);
 arr1[3][0]=0;
 console.log(arr1); //[1,2,3,['0','2','3']]
 console.log(arr2); //[1,2,3,['0','2','3']]

var arr1 = ['red','green'];
var arr2 = arr1.concat();//复制
console.log(arr2)//['red','green'];
arr1.push('black') ;//改变color1的值
console.log(arr2)//["red", "green"]
console.log(arr1)//["red", "green", "black"]
var arr1=[1,2,3,['1','2','3']];
var arr2=arr1.concat();
 arr1[3][0]=0;
 console.log(arr1);//[1,2,3,['0','2','3']]
 console.log(arr2);//[1,2,3,['0','2','3']]

js的深拷贝


var arr1 = ['red','green'];
var arr2 = JSON.parse(JSON.stringify(arr1));//复制
console.log(arr2)//['red','green'];
arr1.push('black') ;//改变color1的值
console.log(arr2)//["red", "green"]
console.log(arr1)//["red", "green", "black"]

<script>
  const oldobj = {
   name:'zs',
   number:{
    num1:1,
    num2:2
   }
  }
  const newobj = {}  //创建一个新的对象
  function deepClone(newobj,oldobj) {
   for (const key in oldobj){
     let val = oldobj[key]
     if (val instanceof Array){ //如果是数组那就创建一个空数组
      newobj[key] =[]
      deepClone(newobj[key],val) 
     } else if (val instanceof Object){ //如果是对象那么就创建一个空对象
      newobj[key] ={}
      deepClone(newobj[key],val)
     } else  (
      newobj[key] = oldobj[key] //基础类型单纯复制
     )
   }
  }
  deepClone(newobj,oldobj) //传入新对象和旧对象
  oldobj.number.num1 = 3
  console.log(newobj)
 </script>
上一篇下一篇

猜你喜欢

热点阅读