js 浅拷贝与深拷贝

来源:互联网 发布:蘑菇软件是什么 编辑:程序博客网 时间:2024/05/24 06:02
  • js可以把变量分成基本类型和引用类型两种,基本类型number,string,boolean,null,undefined五种,而除了这五种基本类型,其他都为引用类型。

  • js的基本类型的值是保存在栈内存中,引用类型是使用栈内存保存地址,堆内存保存对象的值,而=赋值操作符是对栈内存进行操作的。所以复制引用类型时就需要使用到浅拷贝和深拷贝
    (基本类型与引用类型的详细文章)

浅复制与深复制的区别

  • 浅复制只复制一层对象的属性,而深复制递归复制了所有层级
    (hasOwnProperty 检测是否是有自定义属性,可以理解为只复制自定义属性,constructor 返回对象的引用)

浅复制

var obj={    a:1,    arr:[2,3]}var shadowObj=shadowCopy(obj);function shadowCopy(obj){    if(typeof obj !=="object")return;    var newObj;    //保留obj的constructor属性    if(obj.constructor===Array){        newObj=[];    }else{        newObj={};        newObj.constructor=obj.constructor;    }    var dst=[]    for(var prop in obj){        if(obj.hasOwnProperty(prop)){            dst[prop]=obj[prop]        }    }    return dst;}

深复制

var obj={    a:1,    b:[2,3]}function deepCopy(obj){    var str,newObj=obj.constructor===Array?[]:{};    if(typeof obj !=="object"){        return;    }else if(window.JSON){        //如果支持json,则直接将对象序列化,再进行转化为json对象,就可以进行复制        str=JSON.stringify(obj);        newObj=JSON.parse(str);    }else{        for(var prop in obj){            newObj[prop]=typeof obj[prop]==="object"?deepCopy(obj[prop]):obj[prop];        }    }    return newObj;}
0 0
原创粉丝点击