深拷贝 与 浅拷贝

浅拷贝

只对第一从重新赋址,里面的内容依旧是原来的地址let newdata = Object.assign([], ary1, ary2, ...)

1、Object.assign()

let a = {};
Object.assign({}, a) === a; // false

let c = {b: {}};
Object.assign({}, c).b === c.b; // true

2、利用扩展运算符

// 对象
let a = {b: 2}
let newdata = {...a}
// 数组
let a = [1, 2, 3]
let newdata = [...a]

深拷贝

对深层嵌套的数据结构进行拷贝,每一层都要重新赋址

递归

缺点:当对象存在循环引用时,会死递归,解决方案,可以来个对象,数组,new Map(),等来记录,已拷贝的对象,如果存在相同的,就做特殊处理

let copyAry = [];
function deepCopy(data) {
  copyAry.push(data);
  const newData = Array.isArray(data) ? [] : {};
  if (data && typeof data === "object") {
    for (let k in data) {
      if (data.hasOwnProperty(k)) {
        if (data[k] && typeof data[k] === "object") {
          if (copyAry.includes(data[k])) {
            newData[k] = data[k] // 当存在已拷贝的对象时,可以直接赋值或者给 null,从此之后,无法实现拷贝。
          } else {
            newData[k] = deepCopy(data[k]);
          }
        } else {
          newData[k] = data[k];
        }
      }
    }
  }
  console.log(newData);
  return newData
}

let a = {
  b: 1,
}
a.c = a
deepCopy(a)

JSON.parse(JSON.stringify())

遇到对象中有以下情况 会出错。
1.原对象中值为 undefined 或者 function类型 的key会丢失
2.时间对象,会变成字符串形式
3.RegExp定义的属性会变成 {}
4.NaN 类型会变成 null
5.对象存在循环引用,会报错 Uncaught TypeError: Converting circular structure to JSON,将循环结构转换成JSON

let a = {
  a: { b: 1, c: [1, 2]},
  c: 2
}
let newdata = JSON.parse(JSON.stringify(a))
posted @ 2022-05-10 19:44  真的想不出来  阅读(40)  评论(0编辑  收藏  举报