• js实现深拷贝的5种方式


    实现深拷贝的方式

    1. JSON方法实现
    //_tmp和result是相互独立的,没有任何联系,有各自的存储空间。
    let deepClone = function (obj) {
        let _tmp = JSON.stringify(obj);//将对象转换为json字符串形式
        let result = JSON.parse(_tmp);//将转换而来的字符串转换为原生js对象
        return result;
    };
    
    let obj1 = {
        weiqiujaun: {
            age: 20,
            class: 1502
        },
        liuxiaotian: {
            age: 21,
            class: 1501
        }
    };
    
    let test = deepClone(obj1);
    console.log(test);1234567891011121314151617181920
    

    2.用for…in实现遍历和复制

    function deepClone(obj) {
        let result = typeof  obj.splice === "function" ? [] : {};
        if (obj && typeof obj === 'object') {
            for (let key in obj) {
                if (obj[key] && typeof obj[key] === 'object') {
                    result[key] = deepClone(obj[key]);//如果对象的属性值为object的时候,递归调用deepClone,即在吧某个值对象复制一份到新的对象的对应值中。
                } else {
                    result[key] = obj[key];//如果对象的属性值不为object的时候,直接复制参数对象的每一个键值到新的对象对应的键值对中。
                }
    
            }
            return result;
        }
        return obj;
    }
    
    let testArray = ["a", "b", "c", "d"];
    let testRes = deepClone(testArray);
    console.log(testRes);
    console.log(typeof testRes[1]);
    
    let testObj = {
        name: "weiqiujuan",
        sex: "girl",
        age: 22,
        favorite: "play",
        family: {brother: "son", mother: "haha", father: "heihei"}
    };
    let testRes2 = deepClone(testObj);
    testRes2.family.brother = "weibo";
    console.log(testRes2);
    

    3.利用数组的Array.prototype.forEach进copy

    let deepClone = function (obj) {
        let copy = Object.create(Object.getPrototypeOf(obj));
        let propNames = Object.getOwnPropertyNames(obj);
        propNames.forEach(function (items) {
            let item = Object.getOwnPropertyDescriptor(obj, items);
            Object.defineProperty(copy, items, item);
    
        });
        return copy;
    };
    
    let testObj = {
        name: "weiqiujuan",
        sex: "girl",
        age: 22,
        favorite: "play",
        family: {brother: "wei", mother: "haha", father: "heihei"}
    }
    let testRes2 = deepClone(testObj);
    console.log(testRes2);
    

    4.浅拷贝(使用object.assign方法)

    let target=[];
    let testArr=[2,3,5,8];
    Object.assign(target,testArr);
    console.log(target);
    testArr.push(8);
    console.log("我是原来的"+target+",我是现在的"+testArr);
    

    5。递归

    var obj = {
            name:"admin",
            age:18,
            sex:"女",
        }
        var obj2 = {};
        for(var i in obj){
            obj2[i] = obj[i];
        }
        obj2.name = "root";
        console.log(obj.name);  //admin
        console.log(obj2.name);  //root
    ```####改变深拷贝的封装函数
    ```js
       [{}, [], true]
            // 定义一个深拷贝函数  接收目标target参数
            function deepClone(target) {
                // 定义一个变量
                let result;
                // 如果当前需要深拷贝的是一个对象的话
                if (typeof target === 'object') {
                    // 如果是一个数组的话
                    if (Array.isArray(target)) {
                        result = []; // 将result赋值为一个数组,并且执行遍历
                        for (let i in target) {
                            // 递归克隆数组中的每一项
                            result.push(deepClone(target[i]))
                        }
                        // 判断如果当前的值是null的话;直接赋值为null
                    } else if (target === null) {
                        result = null;
                        // 判断如果当前的值是一个RegExp对象的话,直接赋值    
                    } else if (target.constructor === RegExp) {
                        result = target;
                    } else {
                        // 否则是普通对象,直接for in循环,递归赋值对象的所有值
                        result = {};
                        for (let i in target) {
                            result[i] = deepClone(target[i]);
                        }
                    }
                    // 如果不是对象的话,就是基本数据类型,那么直接赋值
                } else {
                    result = target;
                }
                // 返回最终结果
                return result;
    
    请用今天的努力,让明天没有遗憾。
  • 相关阅读:
    转:孙振耀谈人生(推荐)
    自绘按钮的实现
    数据结构知识
    Direct Show采集图像实例
    视觉跟踪
    改变对话框控件的颜色
    笔试题
    CBitmapButton的使用
    Rotor (SSCLI) 2.0 登场!
    Under the hood: 从Win32 SEH到CLI异常处理模型
  • 原文地址:https://www.cnblogs.com/cupid10/p/13649892.html
Copyright © 2020-2023  润新知