0
点赞
收藏
分享

微信扫一扫

js深度拷贝


法一:有局限性

//通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone(obj: any): any {
  const _obj = JSON.stringify(obj),
  const objClone = JSON.parse(_obj);
  return objClone;
}

这种简单粗暴的方法有其局限性,当值为undefined、function、symbol 会在转换过程中被忽略

法二:Object.assign()

针对深拷贝,需要使用其他办法,因为 Object.assign()拷贝的是(可枚举)属性值。个人理解 Object.assign() 只会拷贝一层结构

const log = console.log;

function test() {
  'use strict';
  let obj1 = { a: 0 , b: { c: 0}};
  let obj2 = Object.assign({}, obj1);
  log(JSON.stringify(obj2));
  // { a: 0, b: { c: 0}}

  obj1.a = 1;
  log(JSON.stringify(obj1));
  // { a: 1, b: { c: 0}}
  log(JSON.stringify(obj2));
  // { a: 0, b: { c: 0}}

  obj2.a = 2;
  log(JSON.stringify(obj1));
  // { a: 1, b: { c: 0}}
  log(JSON.stringify(obj2));
  // { a: 2, b: { c: 0}}

  obj2.b.c = 3;
  log(JSON.stringify(obj1));
  // { a: 1, b: { c: 3}}
  log(JSON.stringify(obj2));
  // { a: 2, b: { c: 3}}

  // Deep Clone
  obj1 = { a: 0 , b: { c: 0}};
  let obj3 = JSON.parse(JSON.stringify(obj1));
  obj1.a = 4;
  obj1.b.c = 4;
  log(JSON.stringify(obj3));
  // { a: 0, b: { c: 0}}
}

test();

法三:利用循环和递归

public deepClone(target: any): any {
    if (target == null) {
      return null;
    }
    const cloneObject = new target.constructor();
    Object.keys(target).forEach(
      (attr: string) => {
        cloneObject[attr] = (typeof target[attr] === 'object') ? this.deepClone(target[attr]) : target[attr];
      }
    );

    return cloneObject;
  }

 

举报

相关推荐

0 条评论