zoukankan      html  css  js  c++  java
  • Deepcopy in Javascript

    1. 递归:
      没问题
    function deepClone(obj) {
        var target = {};
        for(var key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key)) {   // 如果obj有key这个属性的话
                if (typeof obj[key] === 'object') {
                    target[key] = deepClone(obj[key]); 
                } else {
                    target[key] = obj[key];
                }
            }
        }
        return target;
    }
    

    2.Json

    JSON.parse(JSON.stringify(obj))
    

    注意: 无法实现对象中方法的深拷贝

    3.Object.assign()
    通过Object.assign(destination, [src1, src2, ...])拷贝
    可以合并多个对象的属性。
    注意: 当对象只有一级属性为深拷贝;
    当对象中有多级属性时,二级属性后就是浅拷贝

    4.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);
    console.log(obj2)
    obj1.a = 20;
    console.log(obj1)
    console.log(obj2)
    //Object {a: 1, b: Object}
    //Object {a: 20, b: Object}
    //Object {a: 1, b: Object}
    

    改变了对象的结构。同时对引用类型也是浅拷贝,只复制一层

    5.Spread语法

    let obj = { a: 1, b: 2, c: 3 };
    let objCopy = { ...obj }; // 将对象 spread 到参数列表中
                              // 然后将结果返回到一个新对象
    
    // 两个对象中的内容相同吗?
    alert(JSON.stringify(obj) === JSON.stringify(objCopy)); // true
    
    // 两个对象相等吗?
    alert(obj === objCopy); // false (not same reference)
    
    // 修改我们初始的对象不会修改副本:
    obj.d = 4;
    alert(JSON.stringify(obj)); // {"a":1,"b":2,"c":3,"d":4}
    alert(JSON.stringify(objCopy)); // {"a":1,"b":2,"c":3}
    

    但是对象中若有其他引用对象,也还是浅copy过去的

    6.lodash._deepcopy()

  • 相关阅读:
    HTML&&CSS
    web概述&HTML快速入门
    JDBC连接池&JDBCTemplate
    基于Breast Cancer dataset的决策树分类及可视化
    三维数组按行优先存储求某位置的地址
    2019年复旦计算机专硕考研经验总结
    1013 Battle Over Cities (25 分)
    1009 Product of Polynomials (25 分)
    1004 Counting Leaves (30 分)
    1090 危险品装箱 (25 分)
  • 原文地址:https://www.cnblogs.com/Nullc/p/14473455.html
Copyright © 2011-2022 走看看