zoukankan      html  css  js  c++  java
  • JS对象的深拷贝处理成浅拷贝

    对象的栈堆

    对象的深拷贝:复制值

    var a = 10;
        var b = a;
        b = 20;
        console.log(a);      // 10
        console.log(b);      // 20

    对象的浅拷贝:只复制地址,没有复制值;两个栈对应一个堆

    var obj = {
            name:"admin"
        }
        var obj2 = obj;  
        obj2.name = "root";
        console.log(obj);   //root
        console.log(obj2);  //root

    以上可看出改变obj2的值,obj1的值也随着改变了,如何做到只复制值,不复制地址

    利用重新创建对象的方式,遍历老对象的所有属性,逐个拷贝属性到新对象中:

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

    json方法

    var person2 = JSON.parse(JSON.stringify(person));  //ES5的方法。
    请用今天的努力,让明天没有遗憾。
  • 相关阅读:
    c语言-何为编程?
    c语言-注释
    【转】使用DirectUI技术实现QQ界面
    c语言-error C2440: “static_cast”: 无法从“UINT (__thiscall CHyperLink::* )(CPoint)”转换为“LRESULT (__thiscall CWnd::* )(CPoint)”
    系统分析师【转】
    c语言-经验之谈
    开源托管站点大全
    c语言-扑克牌小魔术
    c语言-猜数字游戏
    世界语简介
  • 原文地址:https://www.cnblogs.com/cupid10/p/15617760.html
Copyright © 2011-2022 走看看