数组深浅复制

    // 1.使用 slice 或 contcat 方法实现简单复制,简单值不一起改变,但是引用类型则原来对象和复制对象一起改变
    var arr1 = [1, 2, 3, 4],
    arr2 = arr1.slice(0),
    arr3 = arr1.concat();

    console.log(arr1, arr2, arr3);//[1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3, 4],
    arr2[2] = 10;
    arr3[2] = 11;
    console.log(arr1, arr2, arr3);//[1, 2, 3, 4] [1, 2, 10, 4] [1, 2, 11, 4],

    // 但是引用类型则原来对象和复制对象一起改变
    var fun = function(log) {console.log},
    arr1 = [1, 2, [3, 4], {a: 5, b: 6}, fun],
    arr2 = arr1.slice(0),
    arr3 = arr1.concat();
    console.log(arr1, arr2, arr3);
    arr1[0] = 10;
    arr2[3].a = 100;
    arr3[2][1] = 5;
    console.log(arr1, arr2, arr3);
  
    // object.assign()
        var obj = { a: 1 ,b:{d:1}};
        var copy = Object.assign({}, obj);  //浅拷贝
        //因为 Object.assign()拷贝的是属性值。
        //假如源对象的属性值是一个对象的引用,那么它也只指向那个引用。
        //也就是说,如果对象的属性值为简单类型(如string, number),通过Object.assign({},srcObj);得到的新对象为深拷贝;
        //如果属性值为对象或其它引用类型,那对于这个对象而言其实是浅拷贝的。
        console.log(copy); // { a: 1 }
        copy.a=2;
        copy.b.d=2
        console.log('obj',obj);
        console.log('copy',copy);
// 1.0深度复制(1.使用jq的$.extend(true,target,obj))
    var arr1 = [1, 2, [3, 4], {a: 5, b: 6}, 7],
    arr2 = $.extend(true, [], arr1);
    console.log('arr2',arr2);
    arr2[1]=10;
    console.log('arr2',arr1);
    console.log('arr2',arr2);

    // 2.0对象的深度复制newobj = Object.create(sourceObj)
    Object.prototype.clone = function() {
        var obj = {};
        for(var i in this) {
            obj[i] = this[i];
        }
        return obj;
    }
    // 3.0数组的深度复制
    Array.prototype.clone = function() {
        var len = this.lenght,
            arr = [];
        for(var i = 0;i < len;i++) {
            if(typeof this[i] !== "object") {
                arr.push(this[i]);
            } else {
                arr.push(this[i].clone());
            }
        }
        return arr;
    }

    // 2.0深度复制newObj = JSON.parse(JSON.stringify(sourceObj));
    var arr1 = [1, 2, [3, 4], {a: 5, b: 6}, 7],
    arr2 = JSON.parse(JSON.stringify(arr1));

    console.log(arr1, arr2);//[1, 2, [3, 4], {a: 5, b: 6}, 7] [1, 2, [3, 4], {a: 5, b: 6}, 7],
    arr2[1] = 10;
    arr2[3].a = 20;
    console.log(arr1[1], arr2[1]);//2 10
    console.log(arr1[3], arr2[3]);//{a: 5, b: 6} {a:20,b:6}

  
原文地址:https://www.cnblogs.com/zhuMother/p/12204526.html