• js实现深拷贝


    1 使用对象和字符串的转换实现

    function deepClone2(obj) {
        var obj = JSON.stringify(obj),
            objClone = JSON.parse(obj);
        return objClone;
    }

    2 使用扩展运算符

    // 会深拷贝对象的一级属性,对象二级属性进行浅拷贝
    var obj = {a: 1},
        objClone = {...obj};
    
    // 会深拷贝一维数组,对数组里的数组实行浅拷贝
    var arr = [1, 2],
        arrClone = {...arr};

    3 Object.assign()

    // 当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝
    // 但是对象中有对象的时候,此方法在二级属性就是浅拷贝
    var obj = {a: 1},
          objClone = Object.assign({}, obj);

    4 递归实现

    var obj = {
            a: 1,
            b: {
                c: 3
            }
        };
    function deepClone(obj) {
        var objClone = Array.isArray(obj) ? [] : {};
        if (obj && typeof obj === "object") {
            for (key in obj) {
                // for in 会循环出原型上的属性
                if (obj.hasOwnProperty(key)) {
                    if (obj[key] && typeof obj[key] === "object") {
                        objClone[key] = deepClone(obj[key]);
                    } else {
                        objClone[key] = obj[key];
                    }
                }
            }
        }
        return objClone;
    }
    console.log(deepClone(obj));   
    // {
    //     a: 1,
    //     b: {
    //         c: 3
    //     }
    // }
    console.log(deepClone(obj) === obj);   // false

    5 使用Object.create()实现

    // 对于一级属性是深拷贝,二级属性往下是浅拷贝
    function deepCopy(obj) {
      var copy = Object.create(Object.getPrototypeOf(obj));
      var propNames = Object.getOwnPropertyNames(obj);
      
      propNames.forEach(function(name) {
        var desc = Object.getOwnPropertyDescriptor(obj, name);
        Object.defineProperty(copy, name, desc);
      });
      
      return copy;
    }
    
    var obj1 = { a: 1, b: {bc: 50, dc: 100, be: {bea: 1}} };
    var obj2 = deepCopy(obj1);
    obj1.b.bc = 20;
    console.log(obj1.b.bc);   // 20
    console.log(obj2.b.bc);   // 20

    6 能拷贝自身可枚举、自身不可枚举、自身 Symbol 类型键、原型上可枚举、原型上不可枚举、原型上的 Symol 类型键,循环引用也可以拷的深拷贝函数:

    原文:https://blog.csdn.net/chentony123/article/details/81428803

    https://segmentfault.com/a/1190000018371840

  • 相关阅读:
    Asp.net Mvc 身份验证、异常处理、权限验证(拦截器)实现代码
    在执行Action之间检验是否登录
    链接服务器使用方法
    easyui-treegrid节点选择
    SQLServer 存储过程详解
    转载:SQL Server编程基本语法
    【转】SQL Server编程游标
    机器学习14—SVD学习笔记
    机器学习13—PCA学习笔记
    FP Tree算法原理总结(转载)
  • 原文地址:https://www.cnblogs.com/xjy20170907/p/12672852.html
Copyright © 2020-2023  润新知