JS对象的引用,对象的拷贝

1、场景

除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝markdown

将一个对象赋值给另一个对象。函数

var a = [1,2,3];
var b = a;
b.push(4); // b中添加了一个4
alert(a); // a变成了[1,2,3,4] 

 

自定义对象post

var obj = {a:10};
var obj2 = obj;
obj2.a = 20; // obj2.a改变了,
alert(obj.a); // 20,obj的a跟着改变  

 

这就是因为对象类型直接赋值,只是将引用指向同一个地址,致使修改了obj会致使obj2也被修改spa

2、浅拷贝

因此,咱们须要封装一个函数,来对对象进行拷贝,经过for in 循环获取基本类型,赋值每个基本类型,才能真正意义上的复制一个对象code

var obj = {a:10};
function copy(obj){
    var newobj = {};
    for ( var attr in obj) {
        newobj[attr] = obj[attr];
    }
    return newobj;
}
var obj2 = copy(obj);
obj2.a = 20;
alert(obj.a); //10  

 

这样就解决了对象赋值的问题。对象

3、深拷贝

可是这里存在隐患,若是obj中,a的值不是10,而是一个对象,这样就会致使在for in中,将a这个对象的引用赋值为新对象,致使存在对象引用的问题。blog

var obj = {a:{b:10}};
function copy(obj){
    var newobj = {};
    for ( var attr in obj) {
        newobj[attr] = obj[attr];
    }
    return newobj;
}
var obj2 = copy(obj);
obj2.a.b = 20;
alert(obj.a.b); //20  

 

所以,因为这个copy对象只是对第一层进行拷贝,没法拷贝深层的对象,这个copy为浅拷贝,咱们须要经过递归,来拷贝深层的对象。将copy改形成递归便可递归

var obj = {a:{b:10}};
function deepCopy(obj){
    if(typeof obj != 'object'){
        return obj;
    }
    var newobj = {};
    for ( var attr in obj) {
        newobj[attr] = deepCopy(obj[attr]);
    }
    return newobj;
}
var obj2 = deepCopy(obj);
obj2.a.b = 20;
alert(obj.a.b); //10 
相关文章
相关标签/搜索