JavaScript對象引用

1.JavaScript中常見的賦值和引用
1.案例一:典型的賦值操作
var dog = 66 ;
var cat = dog ;
cat += 33 ;

alert(cat);//99
alert(dog);//66
2.案例二:對象引用導致值得更改
 var horse = [1,2,3];
 var bull = horse ;
 bull.push(4);

 alert(bull);//[1,2,3,4]
 alert(horse);//[1,2,3,4]
3.案例三:對象引用指針發生變化
var donkey = [9,8]
var mule = donkey ;
mule = [6,5];

alert(mule);//[6,5]
alert(donkey);//[9,8]
2.對象淺拷貝

通過以上三個案例可以發現值得引用通常不會出現問題,但是在JavaScript中對象的引用經常會出現對象中的值也會出現引用的問題。在實際程序中經常有這樣的需求:拷貝一個對象給另外一個對象實現數據的操縱功能,例如下面的案例:

var American = {
    state:'New York'
};
var China = American ;
China.state = 'Beijing';

alert(American.state);//Beijing
alert(China.state);//Beijing

通過上面的案例發現對象中的屬性值被改變了,這也太不符合常理了,我們要的效果是對象引用的時候不對源對象產生污染,怎樣做到呢?

var American = {
    state:'New York'
};
function copyObj(srcObj){
      var targetObj = {};

       for(var attr in srcObj){
           targetObj[attr] = srcObj[attr];
       }

       return targetObj ;
}
var China = copyObj(American);

China.state = 'Shanghai';

alert(American.state);//New York
alert(China.state);//Shanghai

上述案例已經解決了對象的引用的問題,其實上述案例就是大名鼎鼎的‘對象淺拷貝’。但是淺拷貝本身還是存在問題的,如果對象有多層的嵌套,那麼就會出現內層嵌套對象還是會出現引用的問題,如何解決呢?深度拷貝

3.對象深度拷貝
var American = {
    state: {
        street:'Broadway'
    }
};

function deepCopyObj(srcObj){
    var targetObj = {};

    if(typeof  srcObj != 'object'){
        return srcObj ;
    }

    for(var attr in srcObj){
        targetObj[attr] = deepCopyObj(srcObj[attr]);
    }

    return targetObj ;
}
var China = deepCopyObj(American);

China.state.street = 'BeijingRoad';

alert(American.state.street);//Broadway
alert(China.state.street);//BeijingRoad

上面的深度拷貝中使用了遞歸的方法解決了問題,至此JavaScript中的對象引用問題已經完美解決。

參考
1.JavaScript原始值和對象引用
2.ECMAScript 對象應用
3.javascript對象引用與賦值
4.知乎JavaScript對象引用討論

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章