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()

  • 相关阅读:
    SuperMap开发入门1——资源下载
    去除Win10快捷图标小箭头
    MongoTemplate 分组分页复合条件查询
    mongo db 去除 _class 字段
    MongoDb 快速翻页方法
    mysql select limit 大数据量查询 性能终极提升方法
    MongoDB 数据自动同步到 ElasticSearch
    用 mongodb + elasticsearch 实现中文检索
    MySql5.7InnoDB全文索引(针对中文搜索)
    spring cloud fegin传递request header
  • 原文地址:https://www.cnblogs.com/Nullc/p/14473455.html
Copyright © 2011-2022 走看看