zoukankan      html  css  js  c++  java
  • 超级大牛逼的深克隆方法

    来自超级大牛逼大佬:https://www.cnblogs.com/tangjiao/p/9313829.html

    我们都知道对象浅克隆用Object.assign

    深克隆用JSON.parse(JSON.stringify());

    但是以上的深克隆方法有一个弊端,就是会去掉对象的function属性,以及undefined属性,还会丢失继承关系,Date,正则等

    下面是超级大牛逼的深克隆方法:

    function deepClone(obj){//深克隆
        if(obj === null) return null;
        if(typeof obj !== 'object') return obj;
        if(obj.constructor === Date) return new Date(obj);
        if(obj.constructor === RegExp) return new RegExp(obj);
        var newObj = new obj.constructor(); //保持继承的原型
        for(var key in obj){
            if(obj.hasOwnProperty(key)){
                var val = obj[key];
                newObj[key] = typeof val === 'object' ? arguments.callee(val):val;//递归
            }
        }
        return newObj;
    }
    // 验证
    let o = {
        fun:function(){
            console.log(1111)
        },
        name:"哈哈",
        obj:{
            a:{
                b:1
            }
        },
        arr:[
            {
                c:{
                    d:2
                }
            }
        ]
    }
    let cloneO = deepClone(o);
    cloneO.fun = "clonefun";
    cloneO.name="clone哈哈";
    cloneO.obj.a.b="clone1";
    cloneO.arr[0].c.d="clone2";
    console.log(cloneO);
    console.log(o);
    
    let date = new Date();
    let cloneDate = deepClone(date);
    cloneDate = new Date(new Date().getTime()+1000*60*60);
    console.log(date.getTime());
    console.log(cloneDate.getTime());

    验证后没毛病

  • 相关阅读:
    Linux
    网络
    线程池
    JVM内存结构相关知识
    JVM命令
    maven
    多线程
    AJAX、JSON
    JSP、EL、JSTL
    Mysql面试总结
  • 原文地址:https://www.cnblogs.com/fqh123/p/14256849.html
Copyright © 2011-2022 走看看