美文网首页
实现深拷贝deepCopy函数

实现深拷贝deepCopy函数

作者: 被代码耽误的裁缝 | 来源:发表于2022-05-15 12:17 被阅读0次

实现

// 参数支持的数据类型
// 基础数据类型:string,number,null,undefined,Symbol,boolean
// 引用数据类型:object,array,regexp,date,set,map
function deepCopy(obj) {
  // typeof + 哪些数据类型会返回 'object' ? ['object', 'array', 'regexp', 'date', 'set', 'map']
  let type = Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
  if (type === 'regexp') {
    return new RegExp(obj);
  }
  if (type === 'date') {
    return new Date(obj);
  }
  if (type === 'map') {
    var cloneMap = new Map();
    for (var [key, value] of obj) {
      key = typeof key === 'object' ? deepCopy(key) : key;
      value = typeof value === 'object' ? deepCopy(value) : value;
      cloneMap.set(key, value);
    }
    return cloneMap;
  }
  if (type === 'set') {
    let arr = Array.from(obj);
    var cloneSet = [];
    for (let item of arr) {
      if (typeof item === 'object') {
        cloneSet.push(deepCopy(item));
      } else {
        cloneSet.push(item);
      }
    }
    return new Set(cloneSet);
  }
  if (['object', 'array'].includes(type)) {
    var objClone = Array.isArray(obj) ? [] : {};
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        if (obj[key] && typeof obj[key] === 'object') {
          objClone[key] = deepCopy(obj[key]);
        } else {
          objClone[key] = obj[key];
        }
      }
    }
    return objClone;
  }
  return obj;
}

测试

以下是针对拷贝前后的数据,取任意层级的引用数据类型属性值进行对比是否相等,或者修改新数据是否会影响原数据

var arr = [1, 2, 3];
var map = new Map();
map.set(arr, [{ a: 1, b: { c: 2 } }, 2, 1])

var obj = {
  a: 1,
  b: 'str',
  c: NaN,
  d: undefined,
  e: null,
  f: false,
  g: Symbol('0'),
  h: { aa: 22 },
  i: [{ bb: 33 }, { cc: 44 }, {dd: 0}],
  j: function () { },
  k: /[a-z]/,
  l: new Date('2012-01-03 12:00:00'),
  m: new Set([{ a: 1, b: 2 }, 2, 3]),
  n: map,
}
var newObj = deepCopy(obj);
// newObj.n.set(arr,[2,2,2])
console.log(obj);
console.log(newObj);
// console.log(obj.n.get(arr)[0].b === newObj.n.get(arr)[0].b);

相关文章

  • 实现深拷贝deepCopy函数

    实现 测试 以下是针对拷贝前后的数据,取任意层级的引用数据类型属性值进行对比是否相等,或者修改新数据是否会影响原数据

  • 2018-10-10day9函数基础

    1.浅拷贝、深拷贝 copy.copy(对象):浅拷贝copy.deepcopy(对象):深拷贝""" """拷贝...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • -119| python篇 |浅谈拷贝 copy()

    说到copy(), 很自然就要谈到深拷贝 deepcopy() 和 浅拷贝 copy() 深拷贝:拷贝值 和 重新...

  • day9-函数基础

    一、浅拷贝和深拷贝 import copycopy.copy(对象):浅拷贝copy.deepcopy(对象):深...

  • Day9_基础函数

    一、浅拷贝深拷贝 import copycopy.copy(对象):浅拷贝copy.deepcopy(对象):深拷...

  • day 9

    浅拷贝和深拷贝 copy.copy(对象):浅拷贝 copy.deepcopy(对象):深拷贝 copy.copy...

  • python问题

    语法以及其他基础部分 可变与不可变类型;浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计,如何实现;n...

  • 面经

    Q:浅拷贝与深拷贝,你来设计deepcopy会如何实现? A:浅拷贝只复制对象的引用,新旧引用还是指向同一块内存,...

  • 月薪20K的Python程序员分享的面试时遇到的让你挠墙的问题,

    python语法以及其他基础部分 可变与不可变类型; 浅拷贝与深拷贝的实现方式、区别;deepcopy如果你来设计...

网友评论

      本文标题:实现深拷贝deepCopy函数

      本文链接:https://www.haomeiwen.com/subject/rlziurtx.html