lixiaojuan12 / Summary-of-code

手写代码爽起来~~~
0 stars 0 forks source link

8. 深克隆 #8

Open lixiaojuan12 opened 4 years ago

lixiaojuan12 commented 4 years ago

不仅把第一级克隆一份给新的数组,如果原始数组中存在多级,那么是把每一级都克隆一份赋值给新数组的每一个级别

function cloneDeep(obj) {
  // 传递进来的如果不是对象,则无需处理,直接返回原始的值即可(一般Symbol和Function也不会进行处理的)
  if (obj === null) return null;
  if (typeof obj !== "object") return obj;

  // 过滤掉特殊的对象(正则对象或者日期对象):直接使用原始值创建当前类的一个新的实例即可,这样克隆后的是新的实例,但是值和之前一样
  if (obj instanceof RegExp) return new RegExp(obj);
  if (obj instanceof Date) return new Date(obj);

  // 如果传递的是数组或者对象,我们需要创建一个新的数组或者对象,用来存储原始的数据
  // obj.constructor 获取当前值的构造器(Array/Object)
  let cloneObj = new obj.constructor;
  for (let key in obj) {
    // 循环原始数据中的每一项,把每一项赋值给新的对象
    if (!obj.hasOwnProperty(key)) break;
    cloneObj[key] = cloneDeep(obj[key]);
  }
  return cloneObj;
}

image

defuyu commented 4 years ago
if (!obj.hasOwnProperty(key)) continue; // 原句if (!obj.hasOwnProperty(key)) break;