zoukankan      html  css  js  c++  java
  • 数组深浅复制

        // 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}

      
  • 相关阅读:
    类与类关系的UML图与代码表现
    JAVA加密算法简介
    【转】[C#]二维码生成、解码(QRCode)【支持winform、web调用】
    【转】[C#]二维码生成、解码(QRCode)【支持winform、web调用】
    C# 断网
    subversion prerevpropchange.bat
    How can I get a layer's DataSource properties.
    subversion prerevpropchange.bat
    C# 断网
    使用 Tkprof 分析 ORACLE 跟踪文件3
  • 原文地址:https://www.cnblogs.com/zhuMother/p/12204526.html
Copyright © 2011-2022 走看看