浅谈js中的浅拷贝和深拷贝

时间:2021-12-03 19:53:54

在js中如何把一个对象里的属性和方法复制给另一个对象呢?

下面举一个例子来说明:

var person={name:'chen',age:18};

var son={sex:'男'};

function clone(p,s){

  var s=s||{};//判断s对象是否存在,不存在则定义s为空对象

  for(var prop in p){

    s[prop]=p[prop];

};

    return s;//返回s对象

};

clone(person,son);

调用clone函数最终返回的结果为 {sex: "男", name: "chen", age: 18}.

但是假如 var person={name:'chen',age:18,man:{hight:188}};即person 对象里包含一个子对象man;

那么在复制时浅拷贝只是将子对象的一个引用地址复制给son对象;son和person里的man 属性都指向同一个对象,故改变任一个都能影响到另外一个:例子如下:

 

var person={name:'chen',age:18,man:{hight:188}}

var son={sex:'男'};

 

function clone(p,s){

 

  var s=s||{};//判断s对象是否存在,不存在则定义s为空对象

 

  for(var prop in p){

 

    s[prop]=p[prop];

 

};

 

    return s;//返回s对象

 

};

 

clone(person,son);

son.name='ze';

console.log(son.name);//打印ze

console.log(person.name);//打印chen

son.man.hight=1999;

console.log(son.man.hight);//打印1999

console.log(person.man.hight);//打印1999

深拷贝可以很好的解决引用类型的拷贝问题

采用递归的方法去复制拷贝对象,从而解决浅拷贝带来的弊端

var person={name:'chen',age:18,man:{hight:188}}

var son={sex:'男'};


function clone(p,s){


  var s=s||{};//判断s对象是否存在,不存在则定义s为空对象


  for(var prop in p){

    if(typeof p[prop]=='object'){

        s[prop]=(p[prop].constructor===Array)?[]:{};//三元运算,将s[prop]初始化为数组或者对象

        clone(p[prop],s[prop])

    }

    else{

      s[prop]=p[prop];
    }
    

};


    return s;//返回s对象


};


clone(person,son);

son.name='ze';

console.log(son.name);//打印ze

console.log(person.name);//打印chen
son.man.hight=1999;

console.log(son.man.hight);//打印1999
console.log(person.man.hight);//打印188

以上内容就是我个人的一些理解,希望能给你带来收获!有需要完善的请指出,谢谢!