4-对象的浅拷贝和深拷贝

Huxzhi大约 1 分钟

4-对象的浅拷贝和深拷贝

传址,传值,内存 堆栈的一个知识点 复杂数据类型 浅拷贝:复杂数据类型的传址 深拷贝:完全赋值一份数据一致的非同一个地址的数据

深拷贝

JSON.parse(JSON.stringify(obj))

  1. JSON.parse(JSON.stringify(obj)) 对象转换成字符串,然后再转换为对象

缺点是 undefined 和 函数 无法赋值

最标准常用的深拷贝方法是递归进行拷贝

// 简易深拷贝

function deep(obj) {
  // 判断数据类型是否是数组/对象 进行新数据声明
  if (!(obj instanceof Object) || !(obj instanceof Array)) {
    return obj;
  }
  // 新建一个新的地址
  var targetObj = obj instanceof Array ? [] : {};
  // 循环 obj
  for (const key in obj) {
    // 忽略从原型继承的属性,不进行拷贝
    if (obj.hasOwnProperty(key)) {
      const value = obj[key]; //对应的value
      // 判断 value 是否是数组对象?
      if (value instanceof Array || value instanceof Object) {
        // 递归复制新的地址数据
        targetObj[key] = deep(value);
      } else {
        targetObj[key] = value;
      }
    }
  }
}

obj = {
  a: "er",
  b: 123,
  c: () => {
    alert("你好");
  },
  d: undefined,
};
// 缺少了环 正则 时间 函数等特殊地方的处理
console.log(deep(obj));

缺少了环 正则 时间 函数等特殊地方的处理 但是对于初级前端够了