zoukankan      html  css  js  c++  java
  • js深拷贝和浅拷贝

      js中对象分为基本类型和复合(引用)类型。基本类型存放在栈内存,复合(引用)类型存放在堆内存。

      栈内存存放一些基本类型的变量和对象的引用变量,堆内存用于存放由new创建的对象。

          浅拷贝仅仅是指向被拷贝的内存地址,如果原地址中对象被改变了,那么浅拷贝出来的对象也会相应改变。

            var obj = {
                a : 1,
                b : 2
            }
            var obj1 = obj;
                obj1.b = 3;
            console.log(obj1); //{a: 1, b: 3}
        console.log(obj1===obj); //true

      深拷贝:我在想如何让obj1复制obj的对象内容,在我对obj1进行修改时,不影响obj。通过递归调用浅拷贝来解决。

            let obj = {
                a : "1",
                b : "2",
                c : function col(){},
                d : [1,2,3],
                e : {
                    f : "4"
                }
            }
            function deepCopy(obj){
                if(typeof obj === "object"){
                    if(obj.constructor === Array){
                        var newArr = [];
                        for(var i = 0;i<obj.length;i++) newArr.push(obj[i]);
                        return newArr;
                    }else{
                        var newObj = {};
                        for(var key in obj){
                            newObj[key] = this.deepCopy(obj[key]);
                        }
                        return newObj;
                    }
                }else{
                    return obj;
                }
            }

    简化:

            function deepCopy(obj){
                let temp = obj.constructor === Array?[]:{};
                for(let val in obj){
                    temp[val] = typeof obj[val] == 'object' ? deepCopy(obj[val]) : obj[val];
                }
                return temp;
            }
            console.log(deepCopy(obj));

     

  • 相关阅读:
    编程习题05
    java初始化顺序
    项目开发问题
    hibernate相关知识
    工作使用到的SQL语句
    对于时间的灵活操作
    StringBuffer 和 StringBuilder的区别
    在WebService中处理IP地址
    使用web创建监听器
    工作笔记系列-学习的零零碎碎的技术
  • 原文地址:https://www.cnblogs.com/zhang-wang/p/7581215.html
Copyright © 2011-2022 走看看