您的位置:首页 > Web前端 > JavaScript

Javascript 深拷贝与浅拷贝理解与应用

2018-03-01 23:01 267 查看

深拷贝和浅拷贝的理解

所谓的拷贝一定是复制数据,而一般在讨论深浅拷贝的时候都是在说对象的深浅拷贝。对象拷贝(ObjectCopy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要是为了在新的上下文环境中复用对象的部分或全部数据。JavaScript中有两种类型的对象拷贝:浅拷贝(ShallowCopy)、深拷贝(DeepCopy)

概念

所谓的深拷贝(deepcopy),就是复制一个对象,使得对象在内存级别完全隔离.凡是拷贝发生了,但是在内存级别中没有完全分离就是浅拷贝(shallowcopy).对象就是键值对是由基本类型或对象类型组合而成的键值对(复合类型).

简单对象(plainobject)

​ 成员全部都是基本类型​ {name:'jim',age:19,gender:'男'}

复杂对象(complexobject)

​ 成员可以是另一个对象也可以是简单类型​ {name:'jim',age:19,gender:'男',car:{name:'宝马'}}

清晰的了解其内存结构

拷贝如何实现

functionclone(obj){
 vartmp={};
 for(varkinobj){
  tmp[k]=obj[k];
 }
 returntmp;
}
这个拷贝方法是不完整的拷贝方法
varo1={name:'jim',age:19,gender:'男'};
varo2=clone(o1);
如果代码是:
varo1={name:'jim',age:19,gender:'男',car:{name:'宝马'}};
varo2=clone(o1);

angular.js代码运用

functionbaseExtend(dst,objs,deep){
varh=dst.$$hashKey;
for(vari=0,ii=objs.length;i<ii;++i){
varobj=objs[i];
if(!isObject(obj)&&!isFunction(obj))continue;
varkeys=Object.keys(obj);
for(varj=0,jj=keys.length;j<jj;j++){
varkey=keys[j];
varsrc=obj[key];
if(deep&&isObject(src)){
  if(isDate(src)){
   dst[key]=newDate(src.valueOf());
  }elseif(isRegExp(src)){
   dst[key]=newRegExp(src);
  }elseif(src.nodeName){
   dst[key]=src.cloneNode(true);
  }elseif(isElement(src)){
   dst[key]=src.clone();
  }else{
   if(!isObject(dst[key]))dst[key]=isArray(src)?[]:{};
   baseExtend(dst[key],[src],true);
  }
 }else{
  dst[key]=src;
 }
 }
}
setHashKey(dst,h);
returndst;
}
     参考文献:https://segmentfault.com/a/1190000013107871
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息