深度克隆

2020-04-10  本文已影响0人  RQrry

递归调用

function checkType (origin) {
  return Object.prototype.toString.call(origin).slice(8, -1);
}

function deepClone (origin) {
  let type = checkType(origin);
  let target;

  if (type === 'object') {
    target = {};
  } else if (type === 'array') {
    target = [];
  } else {
    return origin;
  }
  
  for (let prop in origin) {
    if (origin.hasOwnProperty(prop)) {
      if (origin[prop] !== null && typeof origin[prop] === 'object') {
        target[prop] = deepClone(origin[prop]);
      } else {
        target[prop] = origin[prop];
      }
    }
  }
  return target;
}

let a = null;
let arr = [1,2,[3,4],null,true,undefined];
let arr1 = [1,2,{user:'a'}];
let obj = {a: 1, b: 2, c: {d: [3,4]}, e: function fun(){}};
console.log(deepClone(a)); // null
console.log(deepClone(arr)); // [ 1, 2, [ 3, 4 ], null, true, undefined ]
console.log(deepClone(arr1)); // [ 1, 2, { user: 'a' } ]
console.log(deepClone(obj)); // { a: 1, b: 2, c: { d: [ 3, 4 ] }, e: [Function: fun] }

JSON.parse(JSON.stringify(obj))

被克隆的对象为 JSON 格式,即不能包括函数

const obj1 =  {a: {b: 1}};
const deepCopy = obj => JSON.parse(JSON.stringify(obj));
const obj2 = deepCopy(obj1);

obj1.a.b = 2;
obj2.a.b // 1
上一篇 下一篇

猜你喜欢

热点阅读