• 对象(数组)的深克隆和浅克隆(头条)


    对象(数组)的深克隆和浅克隆(头条)

    复制代码
        let obj = {
                a: 100,
                b: [10, 20, 30],
                c: {
                    x: 10
                },
                d: /^d+$/
            };
    
            // 1.浅克隆,obj和obj2是没有关系的,第二级的对象还是引用的同一个地址
            let obj2 = {
                ...obj
            };
    
            // 2.浅克隆,obj和obj2是没有关系的,第二级的对象还是引用的同一个地址
            let obj2 = {};
            for (let key in obj) {
                // 不是私有属性终止
                if (!obj.hasOwnProperty(key)) break;
                obj2[key] = obj[key];
            }


    // ES6 可以用 Object.assign(targeObj, source1,source2,source3) 来实现对象浅拷贝
    复制代码

    如何实现深克隆

    复制代码
        let obj = {
                a: 100,
                b: [10, 20, 30],
                c: {
                    x: 10
                },
                d: /^d+$/
            };
    
    
            // 1.深克隆,json.stringify,将对象搞成字符串,然后json.parse,将字符窜搞成对象
            // 弊端:有缺陷,对于函数,正则,日期,json.stringify,会变成不规则的情况
    
            let obj2 = JSON.parse(JSON.stringify(obj)); 
    复制代码

    2.第二种,利用递归,将属性递归

    复制代码
        let obj = {
                a: 100,
                b: [10, 20, 30],
                c: {
                    x: 10
                },
                d: /^d+$/
            };
    
    
            function deepClone(obj) {
                //=>过滤特殊情况
                if (obj === null) return null;
                if (typeof obj !== "object") return obj;
                // 正则
                if (obj instanceof RegExp) {
                    return new RegExp(obj);
                }
                // 日期对象
                if (obj instanceof Date) {
                    return new Date(obj);
                }
                //=>不直接创建空对象目的:克隆的结果和之前保持相同的所属类
                // let newObj ={}
                let newObj = new obj.constructor;
                for (let key in obj) {
                    if (obj.hasOwnProperty(key)) {
                        // 递归
                        newObj[key] = deepClone(obj[key]);
                    }
                }
                return newObj;
            }
            
            let obj2 = deepClone(obj);
            console.log(obj, obj2);
            console.log(obj === obj2); //false
            console.log(obj.c === obj2.c); //false
    复制代码

    3.使用lodash.cloneDeep实现深克隆

    import _ from 'lodash'
    var obj = {id:1,name:{a:'xx'},fn:function(){}};
    var obj2 = _.cloneDeep(obj);
    obj2.name.a = 'obj2';
    console.log(obj,obj2)
  • 相关阅读:
    001-nginx基础配置-location、Rewrite、return 直接返回码、全局变量
    001-Spring Cloud Edgware.SR3 升级最新 Finchley.SR1,spring boot 1.5.9.RELEASE 升级2.0.4.RELEASE注意问题点
    004-读书记录
    007-ant design 对象属性赋值,双向绑定
    006-ant design -结合echart-地址map市
    005-ant design -结合echart
    002-Spring Framework-Core-01-IoC容器
    003-驾照考试,总结
    006-markdown基础语法
    java-mybaits-010-mybatis-spring-使用 SqlSession、注入映射器
  • 原文地址:https://www.cnblogs.com/fsg6/p/14531481.html
Copyright © 2020-2023  润新知