深拷贝和浅拷贝

操作引用数类型时我们只要值,不要地址? var obj3={a:10,b:10};

var obj4=obj3;

console.log(obj4==obj3); //操作obj3的值时 obj4的值也被改变了

// 浅拷贝:把对象里的属性找出来,复制出来组成一个新的对象

function copy(obj){

var newObj={};

for(var attr in obj){

newObj[attr]=obj[attr];

}

return newObj;

}

// var obj5=copy(obj3);

// console.log(obj5);//{a:10,b:10}

// console.log(obj3);//{a:10,b:10}

// obj5.a=20;

// console.log(obj5);//{a: 20, b: 10}

// console.log(obj3);//{a:10,b:10}

// 浅拷贝:如果对象里某个属性值是个对象数据类型时,这个方法就不适用了

var obj={a:10,b:{a:10}}

var obj6=copy(obj);

console.log(obj6);

obj6.b.a=50;

console.log(obj6);

console.log(obj);

function deepCopy(obj){

if(typeof obj!='object'){

return obj;

}

if(obj instanceof Array){

var newObj=[];

}else{

var newObj={};

}

for(var attr in obj){

newObj[attr]=deepCopy(obj[attr]);

}

return newObj;

}

// var obj7={a:10,m:{a:20}}

// var obj8=deepCopy(obj7);

// obj8.m.a=80;

// console.log(obj8,obj7);

var obj9={a:10,m:[1,2,3,6],n:function(){}}

var obj10=deepCopy(obj9);

console.log(obj9,obj10);

obj10.n='a';

console.log(Object.prototype.toString.call(obj9.n))

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在 JS 中有一些基本类型像是Number、String、Boolean,而对象就是像这样的东西{ name: '...
    tobAlier阅读 3,638评论 0 0
  • 深拷贝:复制多层 浅拷贝:复制一层 在JavaScript使用过程中我们经常会遇到这样的场景; 我们发现,当数组b...
    ferrint阅读 1,800评论 0 0
  • 深复制和浅复制只针对像 Object, Array 这样的复杂对象。简单来说,浅复制只复制一层对象的属性,而深复制...
    婷楼沐熙阅读 2,425评论 0 0
  • 对于问题: var obj1 = {name:'小明'}; var obj2 = obj1; obj2.name ...
    蓝摇扼剑阅读 2,629评论 0 0
  • 1.背景介绍 什么是栈内存和堆内存? JavaScript中的变量的存放有有原始值与引用值之分,原始值代表了原始的...
    lx2487阅读 8,588评论 0 2