美文网首页
js 中 浅克隆 | 深克隆

js 中 浅克隆 | 深克隆

作者: Coldhands | 来源:发表于2019-06-20 12:00 被阅读0次

    浅克隆

    • 浅克隆的对象的引用值是拷贝对象里的引用,这两个对象里面的引用(如对象里的数组或者内嵌对象)指向的地方是一致的。
      注意:object.assign() 也只是浅克隆。

    深克隆

    • 两个对象里面的引用是独立拷贝的,不指向同一个地方。
    三种方法实现深拷贝
    1. 递归赋值所有层级属性
    function deepClone(obj) {
      let objClone = Array.isArray(obj) ? [] : {};
      if (obj && typeof obj === 'object') {
        for (key in obj) {
          if (obj.hasOwnProperty(key)) {
            //判断ojb子元素是否为对象,如果是,递归复制
            if (obj[key] && typeof obj[key] === 'object') {
              objClone[key] = deepClone(obj[key]);
            } else {
              //如果不是,简单复制
              objClone[key] = obj[key];
            }
          }
        }
      }
      return objClone;
    }
    let a = [1,2,3,4],
        b = deepClone(a);
    a[0] = 2;
    console.log(a, b);
    
    运行结果.png
    1. 借用JSON对象的parse和stringify
    function deepClone(obj){
        let _obj = JSON.stringify(obj),
            objClone = JSON.parse(_obj);
        return objClone
    }    
    let a=[0,1,[2,3],4],
        b=deepClone(a);
    a[0]=1;
    a[2][0]=1;
    console.log(a,b);
    
    运行结果.png

    3.借用JQ的extend方法
    $.extend( [deep ], target, object1 [, objectN ] )
    deep表示是否深拷贝,为true为深拷贝,为false,则为浅拷贝
    target Object类型 目标对象,其他对象的成员属性将被附加到该对象上。
    object1 objectN可选。 Object类型 第一个以及第N个被合并的对象。

    let a=[0,1,[2,3],4],
        b=$.extend(true,[],a);
    a[0]=1;
    a[2][0]=1;
    console.log(a,b);
    
    运行结果.png

    相关文章

      网友评论

          本文标题:js 中 浅克隆 | 深克隆

          本文链接:https://www.haomeiwen.com/subject/sphdqctx.html