浅拷贝与深拷贝

75 阅读1分钟

对于我这种总是难以理解递归人来说,深拷贝总是不那么容易被理解,那我们就先从手写浅拷贝开始吧

浅拷贝的实现

let shallyCopy = function (obj) {
  if (typeof obj !== "object") {
    return;
  }
  let newArr = obj instanceof Array ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newArr[key] = obj[key];
    }
  }
  return newArr
};
shallyCopy();

深拷贝的实现

let deepCopy = function (obj) {
  if (typeof obj !== "object") {
    return;
  }
  let newArr = obj instanceof Array ? [] : {};
  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      newArr[key] =
        typeof obj[key] === "object" ? deepCopy(obj[key]) : obj[key];
    }
  }
  return newArr;
};
deepCopy();

深拷贝只需要在浅拷贝的基础上,在赋值时多加上一个判断,如果要赋的值还是对象属性的话,就进行递归

其他深浅拷贝

如果是数组的浅拷贝,通过数组自有的一些方法是可以完成的,如slice,concat等
let arr = ['old', 1, true, null, undefined]; 
let new_arr = arr.concat();

let new_arr1 = arr.concat()

以上只是浅拷贝,如果数组里面有对象obj的话,新旧数组的对象引用地址还是一样的

可直接使用的深拷贝JSON
var arr = ['old', 1, true, ['old1', 'old2'], {old: 1}]

var new_arr = JSON.parse( JSON.stringify(arr) );

console.log(new_arr);

image.png

这个拷贝真是YYDS,对象也能一样深拷贝过来 但是它不能拷贝函数还有日期之类的数据

var arr = [function(){
    console.log(a)
}, new Date(),{
    b: function(){
        console.log(b)
    }
}]

var new_arr = JSON.parse(JSON.stringify(arr));

console.log(new_arr);

image.png