• js数组及对象的深拷贝


    为了解除引用关系复制对象或者数组,如果是浅层的数组或对象(也就是数组中不包含对象或数组),可以通过slice或者concat方法直接实现。

    var arr1 = [1, 2, 3];
    var arr2 = arr1.slice(0);
    arr1[0] = 0;
    console.log(arr1);
    console.log(arr2);
    var arr3 = [1, 2, 3];
    var arr4 = arr3.concat();
    arr3[0] = 0;
    console.log(arr3);
    console.log(arr4);

    也可以通过自己的方法实现,就是遍历数组或对象,返回新数组或者对象。

    var simpleCopy = function(o){
        if (o instanceof Array) {
            var n = [];
            for (var i = 0; i < o.length; ++i) {
                n[i] = o[i];
            }
            return n;
        } else if (o instanceof Object) {
            var n = {}
            for (var i in o) {
                n[i] = o[i];
            }
            return n;
        }
    }

    那么如何实现拷贝包含对象或者数组的这种情况呢?那么就通过递归拷贝来实现。

    var deepCopy = function(o) {
        if (o instanceof Array) {
            var n = [];
            for (var i = 0; i < o.length; ++i) {
                n[i] = deepCopy(o[i]);
            }
            return n;
    
        } else if (o instanceof Object) {
            var n = {}
            for (var i in o) {
                n[i] = deepCopy(o[i]);
            }
            return n;
        } else {
            return o;
        }
    }

    注意:代码中我用instanceof来判断类型,一定要把o instanceof Array 放在 o instanceof Object上面,因为如果是数组的话,instanceof Object也返回true。

    如此即可。

  • 相关阅读:
    OMFCL 使用
    客户化 Summary 页的 Properties
    瑞星升级包下载
    观察者模式Observer
    单例模式Singleton
    java中8大排序
    向上转型和向下转型
    瀑布流的实现
    [转]降级论
    Grid的使用
  • 原文地址:https://www.cnblogs.com/racyily/p/3532176.html
Copyright © 2020-2023  润新知