数组、对象复制,深拷贝和浅拷贝

1、深拷贝与浅拷贝的区别:如果B复制了A,当A发生改变时,B也发生改变,此时为浅拷贝,反之则为深拷贝。

基本数据类型,包括:string、number、boolean、null、undefined。

引用数据类型,包括:数组、函数、对象。

1)基本数据类型储存在栈内存中,如:let a=1;b=a;

当b=a时,栈内存会重新开辟一个内存,当修改a的值时,b的值不会改变。

2)引用数据类型,名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存。

如:let a=[1,2,3,4];b=a

当b=a进行拷贝时,其实只是复制a的引用地址,并非堆里面的值。当a数组发生改变时,b也会受到影响。

2、数组深拷贝

1)slice

     let arr=[2,3,4,5];

     let arr1=arr.slice();

     arr[0]=0;

     console.log(arr1);//[2,3,4,5]

     console.log(arr===arr1);//false

2)concat

      Array.prototype.clone=function(){

           return [].concat(this);

           //return this.concat()

       };

    let arr=[123,"aaa"];

    let arr1=arr.clone(arr)

    arr[0]=0;

    console.log(arr1);

3)遍历数组

    Array.prototype.clone=function(){

        let a=[];

        for(let i=0,l=this.length;i

               a.push(this[i]);

         };

        return a;

    }

    let arr=[1,2,3,4,5,6];

    let arr1=arr.clone();

    console.log(arr1);

4)扩展运算符

    let a=[1,2,3,4,5];

    let b=[...a];

    a[0]=0;

    console.log(b);

3、对象的深拷贝

1)for循环

    let obj={

    name:"zjj",

    age:25,

    job:"software engineer"

    }

    const copyObj=(obj)=>{

        let res={};

        for(let key in obj){

            res[key]=obj[key];

        }

        return res;

    }

  let obj1=copyObj(obj);

2、转换成json再转换成对象

  let obj={

    name:"zjj",

    age:25,

    job:"software engineer"

    }

    const obj1=JSON.parse(JSON.stringify(obj));

    console.log(obj1);

3)扩展运算符

   

  let obj={

    name:"zjj",

    age:25,

    job:"software engineer"

    }

const {...obj1}=obj;

obj.age=18;

console.log(obj1);

你可能感兴趣的:(数组、对象复制,深拷贝和浅拷贝)