# 深浅拷贝

# 浅拷贝

只拷贝基本类型的数据和指向引用类型的在栈内存中的地址指针,而不拷贝对象在堆中的内存。

浅拷贝的方式: 变量赋值即是浅拷贝

# 深拷贝

深拷贝它会创造一个一模一样的独立的对象,在堆内存中的空间也是独立的两份。深拷贝的实现原理就是递归调用浅拷贝

# 几个带有拷贝功能的函数

concat()、slice()、splice():

如果数组的项不包含对象的话,就是深拷贝;如果数组中有对象的话,就是浅拷贝。

Object.assign()、Object.create():

如果对象只有一层,就是深拷贝。如果对象有多层,就是将第一层深拷贝,之下的为浅拷贝。

JSON.parse():

JSON对象的序列化和反序列化也可以实现深拷贝。

但是只对基本类型和数组、对象等满足json数据格式的数据有作用,对正则、function等无效

# 自己实现浅拷贝

//浅拷贝
var shallowCopy = function(obj){
  //不拷贝基本类型
  if(typeof obj !== 'object'){
    return;
  }
  var new_obj = obj instanceof Array ? []:{};
  for(var key in obj){
    if(obj.hasOwnProperty(key)){
      new_obj[key] = obj[key];
    }
  }
  return new_obj;
}

# 自己实现深拷贝

//深拷贝:递归
var deepCopy = function(obj){
  if(typeof obj !== 'object'){
    return;
  }
  var new_obj = obj instanceof Array ?[]:{};
  for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
      new_obj[key]=(typeof obj[key] === "object")?deepCopy(obj[key]):obj[key];
    }
  }
  return new_obj;
}

备注:以上的实现方式不支持函数和正则的深拷贝

作者:王龙楷; 标签:原创; 提交时间: 10/29/2020, 4:26:47 PM