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 
相關文章
相關標籤/搜索