js deepclone(深度克隆)

1.最简单的方法,序列号反序列化一遍就好了,但是会丢失function,undefined或者NaN的属性

JSON.parse(JSON.stringify(xxx));

2.自己写一个方法,遍历获取属性

function deepClone(obj) {
  let objClone;
  if (obj && (obj.constructor == Object || obj.constructor == Array)) {
    objClone = new obj.constructor();
  } else {
    return obj;
  }
  for (const key in obj) {
    if ({}.hasOwnProperty.call(obj, key)) {
      objClone[key] = deepClone(obj[key]);
    }
  }
  return objClone;
}

后续百度了发现还有其他方法,在这补充一下
原文:https://zhuanlan.zhihu.com/p/78234841

3.通过Object.getPrototypeOf() 获取目标对象的原型,通过Object.assign()生成一个新的对象

function deepclone(target) {
  if (typeof target !== "object") return target;
  return Object.assign(
    {},
    Object.create(Object.getPrototypeOf(target)),
    target
  );
}

4.通过Object.getPrototypeOf() 获取目标对象的原型,通过扩展运算符以及proto来实现深度克隆(仅适用于浏览器端)

function deepclone(target) {
  if (typeof target !== "object") return target;
  return {
    __photo__: Object.getPrototypeOf(target),
    ...target
  };
}

你可能感兴趣的:(javascript,开发语言,ecmascript)