ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-03-14 09:33:23  阅读:131  来源: 互联网

标签:key 10 obj2 obj 克隆 let 数组 头条


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

复制代码
    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];
        }
复制代码

 

 

如何实现深克隆

 

复制代码
    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)

 

标签:key,10,obj2,obj,克隆,let,数组,头条
来源: https://www.cnblogs.com/fsg6/p/14531481.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有