深浅拷贝

封装方法

function clone (data) {
  const t = Object.prototype.toString.call(data);
  const type = t.replace('[object ', '').replace(']', '').toLowerCase();

  let copyData;

  if (type === 'object' || type === 'array') {
    copyData = type === 'object' ? {} : [];
    for(let key in data){
      copyData[key] = clone(data[key])
    }
  } else {
    copyData = data;
  }

  return copyData;
}

调用示例

const obj = {
  num: 1,
  str: 'a',
  bol: true,
  key1: null,
  key2: undefined,
  func: function () {console.log('45sss')},
  arr: [
    1,
    'a',
    true,
    null,
    undefined,
    function () {},
    [],
    {},
  ],
  obj: {
    num: 2,
    str: 'a',
    bol: true,
    key1: null,
    key2: undefined,
    func: function () {},
    arr: [],
    obj: {}
  }
};

const arr = [
  1,
  'a',
  true,
  null,
  undefined,
  () => {console.log('45sss')},
  [
    1,
    'a',
    true,
    null,
    undefined,
    function () {},
    [],
    {},
  ],
  {
    num: 1,
    str: 'a',
    bol: true,
    key1: null,
    key2: undefined,
    func: function () {},
    arr: [],
    obj: {}
  }
];

console.log('*************** 数组深拷贝测试 ***************');
const arr2 = clone(arr);
arr2[0] = 10;
console.log('arr', arr);
console.log('arr2', arr2);

console.log('*************** 数组浅拷贝测试 ***************');
const arr3 = arr;
arr3[0] = 20;
console.log('arr', arr);
console.log('arr3', arr3);

console.log('*************** 对象深拷贝测试 ***************');
const obj2 = clone(obj);
obj2.num = 10;
console.log('obj', obj);
console.log('obj2', obj2);

console.log('*************** 对象浅拷贝测试 ***************');
const obj3 = obj;
obj3.num = 20;
console.log('obj', obj);
console.log('obj3', obj3);

结果展示

深浅拷贝