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

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];        }

如何实现深克隆

1

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

相关推荐