JS深浅拷贝常用方法

浅拷贝:

浅拷贝出现原因

let a = {
    name:'Jack',
    age:'10'
  };
  let b = a;
  a.name = 'Wang';
  console.log(a.name);//Wang
  console.log(b.name);//Wang

上述代码中,如果我们希望a和b的属性是独立的,那么最后结果显然不符期望,
简单来说发生原因:引用类型,栈内存存放指针,内容在堆内存中,赋值时只拷贝了指针。

**浅拷贝常用方法
1.Object.assign()

let shallowA = {
    name:'Jack',
    age:10
  };
  let shallowB = Object.assign({},shallowA);
  shallowA.name = 'Zhang';
  console.log(shallowA.name);//Zhang
  console.log(shallowB.name);//Jack

2.三点运算符

let shallowC = {...shallowA};
  shallowA.age = 11;
  console.log(shallowA.age);//11
  console.log(shallowC.age);//10

深拷贝

深拷贝出现原因

let c = {
    name:'June',
    family:{
      mother:'Lily',
      father:'Bob'
    },
    age:12
  }
  let d = {...c};
  let e = Object.assign({},c);
  c.family.mother = 'Venessa';
  console.log(c.family);//mother:'Venessa' 
  console.log(d.family);//mother:'Venessa' 
  console.log(e.family);//mother:'Venessa' 

简单来说,对于这种对象中仍有对象的情况,就需要使用深拷贝了

深拷贝常用方法
1.JSON.parse(JSON.stringfy(object))

let deepA = {
    age: 1,
    jobs: {
    first: 'FE'
    }
  };
  let deepB = JSON.parse(JSON.stringify(deepA));
  deepA.jobs.first = 'Ali';
  console.log(deepA.jobs);//Ali
  console.log(deepB.jobs);//FE

这种方法是利用JSON序列化和反序列化方法将内容完全展开,但是它仍有局限性:
1.会忽略 undefined
2.会忽略 symbol
3.会忽略 函数
4.不能解决循环引用的对象(obj.a = obj.b obj.c.d = obj.a等)

使用lodash的deepClone()
lodash库中的deepClone函数。

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

推荐阅读更多精彩内容

  • 【15年3月】那天深夜你跟我告白,我用距离太远你太小这些话搪塞过去,我知道这很不负责任对你也很不公平,其实这也是对...
    努力努力再努力Xu阅读 201评论 0 0
  • 一天一天,泰然以处之。 还是坚信托尔斯泰那句话“要想幸福,就应该相信幸福是可能的。我活一天,就应当生活,而且生活得...
    遇见_320e阅读 207评论 0 1
  • Linux环境变量 环境变量配置的方法有两种,临时的和全局的。 https://www.jianshu.com/p...
    原仔nevermore阅读 216评论 0 2
  • 我在心里留了一块地 一亩分三田 一处种下你洁白的笑牙 一处种下你宽厚的臂膀 一处种下你纯真的爱情 每天 ,温柔 陪...
    一好心阅读 189评论 4 5
  • 昨天下午我们上了彩泥课,我们老师让用树枝做花的树枝,老师让四个人一组,我自己做了一个,老师还给我照了相,回家我还让...
    李嘉宝1阅读 182评论 0 0