js深浅克隆

kingcwt2019-2-15前端javascript

深克隆指我们把一个多维度的对象或者数组进行一份拷贝。浅克隆指我们只克隆了多维数组或者对象的最外层,改变里面的值也会改变原对象或者数组。而深克隆则不会。

let obj = {
  a: 200,
  b: [310, 320, 330],
  c: {
    x: "cwt",
  },
  d: /^\d+$/,
};

拿上面的例子 我们做一个简单的浅克隆

浅克隆

let obj = {
  a: 200,
  b: [310, 320, 330],
  c: {
    x: "cwt",
  },
  d: /^\d+$/,
};
let obj2 = { ...obj };

console.log(obj2, obj); //我们会发现obj2 和obj 是一模一样的。
//但是
obj2.c.x = 100;
//我们会发现 obj下的c下的x也等于100 这就是浅克隆

//浅克隆方法2
let newObj = {};
for (key in obj) {
  if (obj.hasOwnProperty(key)) {
    newObj[key] = obj[key];
  }
}

深克隆

let obj = {
  a: 200,
  b: [310, 320, 330],
  c: {
    x: "cwt",
  },
  d: /^\d+$/,
};

let obj2 = JSON.parse(JSON.stringify(obj));
obj2.c.x = 100;
//我们发现 我们发现通过JSON.stringify再JSON.parse之后 我们改变obj2中的值 obj值不改变 所以深拷贝成功
//但是经过JSON.stringify后 d中的正则变成了空对象 被JSON.stringify处理过了 所以这也是它的弊端

封装一个深克隆的方法

function deepClone(obj) {
  if (obj instanceof RegExp) return new RegExp(obj);
  if (obj instanceof Date) return new Date(obj);
  if (obj == null) return null;
  if (typeof obj !== "object") return obj;

  let newObj = new obj.constructor();

  for (key in obj) {
    if (obj.hasOwnProperty(key)) {
      newObj[key] = deepClone(obj[key]);
    }
  }
  return newObj;
}
let obj2 = deepClone(obj);
Last Updated 10/16/2023, 7:06:22 AM
What do you think?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
Comments
  • Latest
  • Oldest
  • Hottest
Powered by Waline v2.15.8