深浅拷贝

  • 什么是浅拷贝?
  • 什么是深拷贝?

1.浅拷贝

只拷贝一层,更深层次对象级别只拷贝引用。

var arr = [2,4]; // 一层,可以被拷贝
var arr = [{foo:2}];// 深层次,无法浅拷贝

演示

// 浅拷贝
let obj = {
  id:1,
  name: 'Andy',
  msg: { //对象中的对象,只拷贝了引用
    age:1
  }
}
let o = {}
for (var k in obj) {
  o[k] = obj[k]   //
}
console.log(o);

o.name = 'zs'   //o复制过来进行修改不会影响obj的
o.msg.age = 12  //o修改了,某一方修改便会全局修改
console.log(o);
console.log(obj);

实现

1)ES5 concat实现or遍历赋值

const a = [2,8,5];
const b = a.concat();  

console.log(b); // [2,8,5]
b[0] = 9;
console.log(b); // [9,8,5]
console.log(a); // [2,8,5]

2)ES6

const a = [2,8,5];
const b = [...a]; 
or
const [...b] = a; 

console.log(b); // [2,8,5]
b[0] = 9;
console.log(b); // [9,8,5]
console.log(a); // [2,8,5]

// 对象的浅拷贝
Object.assign(拷贝目的地址,要拷贝的对象)

总结

  1. 第一层拷贝的内容相当于数据复制,修改互不干扰
  2. 第二层拷贝只拷贝了引用,修改其中一个也会引起另外一个的同步变化。

2.深拷贝

深拷贝每层都拷贝,不会有引用,把深层对象重新拷贝出来再给拷贝对象。

实现

1)利用递归实现

let obj = {
  id:1,
  name: 'Andy',
  msg: {
    age:1,
    sex: [
      2
    ]
  }
}
let o = {}

// 封装函数,利用递归的方式进入每一层让每一层变为第一层来实现深拷贝
function deepCopy (newObj, oldObj) {
  for (var k in oldObj) {

    // 获取属性值
    var item = oldObj[k]

    // 判断这个值是否数组
    if (item instanceof Array ) {
      newObj[k] = []
      deepCopy(newObj[k], item)

       // 判断是否是对象
    } else if (item instanceof Object) {
      newObj[k] = {}
      deepCopy(newObj[k], item)
      // 是简单数据类型
    } else {
      newObj[k] = item
    }
  }
}
deepCopy(o, obj)
console.log(o);
console.log(obj);
o.msg.age = 13  //o和obj数据互不干扰
o.msg.sex[0] = 14  //o和obj数据互不干扰

总结

注意,封装函数的时候要把数组的判断放在对象判断的前面。
原因:数组也属于对象,而对象却不属于数组。
如果对象判断在前面,就不会去判断数组了。

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

推荐阅读更多精彩内容

  • 一、 “深拷贝” 与 “浅拷贝” 的区别 对于这个问题,可以考虑从深拷贝和浅拷贝的使用或者起源说起,也就是为什么会...
    dingFY阅读 555评论 0 2
  • 如何判断数组类型 typeof ❌对Array不起作用,会将结果判断为object,同理null instance...
    糕糕AA阅读 234评论 0 0
  • 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是...
    爱上西红柿炒蛋阅读 291评论 0 0
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,138评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,115评论 0 4