基础学习: deepClone

手写一个 deepClone
更新于: 2023-04-20 19:31:50

几种方法

  • JSON.strinify
  • 手写,递归
  • 使用第3方库(略,不过,实际生产建议使用这种)

使用 JSON.stringify

  • 优点: 实现简单,适合纯数据的情况
  • 缺点: 某些类型无法序列化,而导致数据选择
function deepClone(obj) {
  return JSON.parse(JSON.stringify(obj));
}

手写

  • null 以及非 “object” 类型(typeof 得到),直接排序
  • 循环(for in) key不变
    • value 为非 object 类型,直接 deepClone 
    • valueobject 类型,递归
const obj = {
  name: 'aric',
  age: 108,
  address: {
    city: 'wh'
  },
  children: [
    {
      name: 'jay',
      age: 5
    }
  ]
};

function deepClone(obj) {
  if (obj == null) return obj;
  if (typeof obj !== 'object') return obj;

  var res = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    res[key] = typeof obj[key] === 'object' ? deepClone(obj[key]) : obj[key];
  }
  return res;
}

console.log(deepClone(obj));

相关问题

  • 需要过滤原型上的方法 - hasOwnProperty
  • 需要考虑 circluar 对象 - try-catch JSON.strinify ,防止无限循环
  • dom 节点,使用 cloneNode 来完成 clone