亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JS引用類型數(shù)據(jù)的淺拷貝與深拷貝

MangoGoing / 1720人閱讀

摘要:拷貝到,屬性均順利拷貝。大輝小輝,小輝,大輝小輝,小輝,大輝但是,若修改的屬性變?yōu)閷ο蠡驍?shù)組時,那么對象之間就會發(fā)生關(guān)聯(lián)。深拷貝不希望對象之間產(chǎn)生關(guān)聯(lián),那么這時候可以用到深拷貝。

淺拷貝

之前文章提到,在定義一個對象或數(shù)組時,變量存放的往往只是一個地址。當(dāng)我們對堆內(nèi)存中的對象復(fù)制時,如果屬性是對象或數(shù)組時,這時候我們拷貝的只是一個棧內(nèi)存指針。因此b對象在訪問該屬性時,會根據(jù)指針尋找到a對象指向的堆內(nèi)存對象,兩者的屬性值會指向同一內(nèi)存空間。

var a = {
    key1:"11111"
}
function Copy(p) {
    var c = {};
    for (var i in p) { 
      c[i] = p[i];
    }
    return c;
}
a.key2 = ["小輝","小輝"];
var b = Copy(a);
b.key3 = "33333";
alert(b.key1);     //1111111
alert(b.key3);    //33333
alert(a.key3);    //undefined
//對象中key1屬性是字符串,key2屬性是數(shù)組。a拷貝到b,12屬性均順利拷貝。給b對象新增一個字符串類型的屬性key3時,b能正常修改,而a中無定義。說明子對象的key3(基本類型)并沒有關(guān)聯(lián)到父對象中,所以undefined。

b.key2.push("大輝");
alert(b.key2);    //小輝,小輝,大輝
alert(a.key2);    //小輝,小輝,大輝

但是,若修改的屬性變?yōu)閷ο蠡驍?shù)組時,那么對象之間就會發(fā)生關(guān)聯(lián)。從以上彈出結(jié)果可知,對b對象進(jìn)行修改,a、b的key2屬性值(數(shù)組)均發(fā)生了改變。其在內(nèi)存的狀態(tài),可以用下圖來表示。

深拷貝

不希望對象之間產(chǎn)生關(guān)聯(lián),那么這時候可以用到深拷貝。既然屬性值類型是數(shù)組和或?qū)ο髸r只會傳址,那么我們就用遞歸來解決這個問題,把要復(fù)制的對象中所有屬于對象的屬性類型都遍歷賦給新對象即可。

function Copy(p, c) {
    var c = c || {};
    for (var i in p) {
      if (typeof p[i] === "object") {
         c[i] = (p[i].constructor === Array) ? [] : {};
         Copy(p[i], c[i]);
      } else {
         c[i] = p[i];
      }
    }
    return c;
    }    
a.key2 = ["小輝","小輝"];
var b={};
b = Copy(a,b);        
b.key2.push("大輝");
alert(b.key2);    //小輝,小輝,大輝
alert(a.key2);    //小輝,小輝

過程如下圖

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/88870.html

相關(guān)文章

  • JavaScript中的淺拷貝與深拷貝

    摘要:所以,深拷貝是對對象以及對象的所有子對象進(jìn)行拷貝實現(xiàn)方式就是遞歸調(diào)用淺拷貝對于深拷貝的對象,改變源對象不會對得到的對象有影響。 為什么會有淺拷貝與深拷貝什么是淺拷貝與深拷貝如何實現(xiàn)淺拷貝與深拷貝好了,問題出來了,那么下面就讓我們帶著這幾個問題去探究一下吧! 如果文章中有出現(xiàn)紕漏、錯誤之處,還請看到的小伙伴多多指教,先行謝過 以下↓ 數(shù)據(jù)類型在開始了解 淺拷貝 與 深拷貝 之前,讓我們先...

    546669204 評論0 收藏0
  • JavaScript中的淺拷貝與深拷貝

    摘要:所以,深拷貝是對對象以及對象的所有子對象進(jìn)行拷貝實現(xiàn)方式就是遞歸調(diào)用淺拷貝對于深拷貝的對象,改變源對象不會對得到的對象有影響。 上一篇 JavaScript中的繼承 前言 文章開始之前,讓我們先思考一下這幾個問題: 為什么會有淺拷貝與深拷貝 什么是淺拷貝與深拷貝 如何實現(xiàn)淺拷貝與深拷貝 好了,問題出來了,那么下面就讓我們帶著這幾個問題去探究一下吧! 如果文章中有出現(xiàn)紕漏、錯誤之處...

    AZmake 評論0 收藏0
  • 關(guān)于js的淺拷貝與深拷貝

    摘要:原文地址淺拷貝和深拷貝只針對像這樣的復(fù)雜對象的簡單來說,淺拷貝只拷貝一層對象的屬性,而深拷貝則遞歸拷貝了所有層級。淺拷貝通過來實現(xiàn)淺拷貝。 原文地址:http://www.silenceboy.com/201... 淺拷貝和深拷貝只針對像Object, Array這樣的復(fù)雜對象的.簡單來說,淺拷貝只拷貝一層對象的屬性,而深拷貝則遞歸拷貝了所有層級。 淺拷貝 通過 Object.ass...

    summerpxy 評論0 收藏0
  • 淺談JavaScript的淺拷貝與深拷貝

    摘要:引用數(shù)據(jù)類型是存放在堆內(nèi)存中的,變量實際上是一個存放在棧內(nèi)存的指針,這個指針指向堆內(nèi)存中的地址。棧和堆的區(qū)別其實淺拷貝和深拷貝的主要區(qū)別就是數(shù)據(jù)在內(nèi)存中的存儲類型不同。這里,對存在子對象的對象進(jìn)行拷貝的時候,就是深拷貝了。 數(shù)據(jù)類型 在開始拷貝之前,我們從JavaScript的數(shù)據(jù)類型和內(nèi)存存放地址講起。數(shù)據(jù)類型分為基本數(shù)據(jù)類型 和引用數(shù)據(jù)類型 基本數(shù)據(jù)類型主要包括undefin...

    娣辯孩 評論0 收藏0
  • 關(guān)于JavaScript的淺拷貝和深拷貝

    摘要:引用類型值引用類型值是保存在堆內(nèi)存中的對象,變量保存的只是指向該內(nèi)存的地址,在復(fù)制引用類型值的時候,其實只復(fù)制了指向該內(nèi)存的地址。 前言 要理解 JavaScript中淺拷貝和深拷貝的區(qū)別,首先要明白JavaScript的數(shù)據(jù)類型。JavaScript有兩種數(shù)據(jù)類型,基礎(chǔ)數(shù)據(jù)類型和引用數(shù)據(jù)類型。js的基本類型:undefined,null,string,boolean,number,s...

    shenhualong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<