深拷贝

         function _type(value) {
            return Object.prototype.toString.call(value);
        }

        function _deepClone(obj) {
            // 如果是null直接返回null
            if (obj === null) return null;
            // 如果是基本数据值或者函数,也直接返回即可(函数无需克隆处理)
            if (typeof obj !== 'object') return obj;
            // 如果是正则
            if (_type(obj) === '[object RegExp]') return new RegExp(obj);
            // 如果是日期格式的数据
            if (_type(obj) === '[object Date]') return new Date(obj);

            // obj.constructor:找到的是所属类原型上的constructor,而原型上的constructor指向的是当前类本身 =>保证传递进来什么类型的值,我们最后创建的newObj也是对应类型的
            // obj.constructor === > constructor  ====>  类
            let newObj = new obj.constructor;
            for (let key in obj) {
                if (!obj.hasOwnProperty(key)) break;
                // 如果某一项的值是引用值吗,我们还需要进一步迭代循环,把引用值中的每一项也进一步克隆 =>深度克隆
                newObj[key] = _deepClone(obj[key]);
            }
            return newObj;
        }

        let arr1 = [10, 20, {
            name: 'zxw'
        }, /^\d+$/, function () {}];
        let arr2 = _deepClone(arr1);
        console.log(arr2);

        let obj1 = {
            name: 'zxw',
            ke: ['node', 'vue', 'react'],
            teacher: {
                n: 'jack',
                m: 'mike'
            }
        };
        let obj2 = _deepClone(obj1);
        console.log(obj2);
Object.prototype.toString.call(value) 可以用来 判断数据类型   链接: https://www.cnblogs.com/cn-chy-com/p/11524980.html
posted @ 2020-05-08 19:39  1点  阅读(144)  评论(0编辑  收藏  举报