# 对象拷贝

应该有朋友面试时碰到过,深拷贝和浅拷贝的问题...

# 浅拷贝

把要拷贝对象的属性一个一个的复制,碰到值是基本类型直接复制值,碰到值是对象类型,直接复制指针。 问题:改变复制后的对象内,值的引用的数据,会影响原对象

Object.assign() (opens new window) es6新增

将所有可枚举属性的值从一个或多个源对象分配到目标对象。方法最后返回目标对象

var obj = {
  num1: 1,
  num2: 2
};

var newObj = Object.assign({}, obj); // 利用assign的特性,可以实现浅拷贝
// 浅拷贝存在的问题
var obj = {
  num1: 1,
  person: {
    age: 18
  }
};

var newObj = Object.assign({}, obj);
newObj.person.age = 20;

console.log(newObj.person.age); // 20
console.log(obj.person.age); // 20

# 深拷贝

把要拷贝对象的属性一个一个的复制,碰到值是基本类型直接复制值,碰到值是对象类型递归进行复制。 问题:有循环引用的问题,但可以解决。

// 简单方法
var newObj = JSON.parse( JSON.stringify(obj) );
// 需要保证对象是JSON完全的,只适用于部分情况。
// 没有解决循环引用的问题

由于深拷贝设计的知识比较多,包括:值类型的判断使用map来解决循环引用使用weakMap来优化内存等内容,这里就先简单介绍一下概念,感兴趣的朋友可以看看这篇文章。 如何写出一个惊艳面试官的深拷贝? (opens new window)

如果觉得内容对你有帮助,请点个关注,你们的鼓励是我持续更新下去的动力,比心。

如需转载请注明出处,感恩。

更多内容可先关注GitHub (opens new window)