成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

解析js對(duì)象的淺復(fù)制與深復(fù)制原理

wenyiweb / 1282人閱讀

摘要:淺復(fù)制假設(shè)有兩個(gè)對(duì)象現(xiàn)在想把對(duì)象的值復(fù)制給,由于對(duì)象的兩個(gè)值都是原始類型,用淺復(fù)制即可。深復(fù)制簡(jiǎn)單來說深復(fù)制就是當(dāng)遇到值是對(duì)象類型的時(shí)候就再運(yùn)行一遍復(fù)制。

試想這樣一種場(chǎng)景,自己編寫了一個(gè)js插件,調(diào)用插件時(shí)參數(shù)是以對(duì)象的形式傳入的,插件也有自己的默認(rèn)值,當(dāng)運(yùn)行的時(shí)候就涉及到傳入?yún)?shù)和默認(rèn)值的合并,即用到對(duì)象的深復(fù)制和淺復(fù)制。

淺復(fù)制

假設(shè)有兩個(gè)對(duì)象

var objA = {
  a: "aa",
  b: "bb"
};
var objB = {};

現(xiàn)在想把對(duì)象A的值復(fù)制給B,由于對(duì)象A的兩個(gè)值都是原始類型,用淺復(fù)制即可。

function copy(sub, sup) {
  for (var key in sup) {
    sub[key] = sup[key];
  }
}
copy(objB, objA);

但是,假如對(duì)象A的其中一個(gè)值是引用類型。

var objA = {
  a: "aa",
  b: {
    c: function () {
      console.log("c");
    }
  }
};
var objB = {};
copy(objB, objA);
objB.b.c()  // 結(jié)果為c

運(yùn)行復(fù)制的函數(shù)時(shí)也可以復(fù)制成功,但是存在著一個(gè)潛在的風(fēng)險(xiǎn),即當(dāng)修改對(duì)象A的b.c的值時(shí),對(duì)象B也跟著改變了。

copy(objB, objA);
objB.b.c()  // 結(jié)果為c
objA.b.c = function () {
  console.log("d");
}
objB.b.c()  // 結(jié)果為d

雖然我們修改的是objA的b.c的值,但是objB中的值也跟著改變了。要是在多人協(xié)同的大項(xiàng)目中,其中一個(gè)人修改了一個(gè)對(duì)象的值會(huì)導(dǎo)致其他人的值全部改變,這顯然不是我們想要的結(jié)果,于是需要進(jìn)行深復(fù)制。

深復(fù)制

簡(jiǎn)單來說深復(fù)制就是當(dāng)遇到值是對(duì)象類型的時(shí)候就再運(yùn)行一遍復(fù)制。

function deepCopy (sub, sup) {
  for (var key in sup) {
    if (typeof sup[key] === "object") {
      sub[key] = {};
      deepCopy (sub[key], sup[key]);
    } else {
      sub[key] = sup[key];
    } 
  }
}

運(yùn)行深復(fù)制后,即使改變objA中b.c的值,也不會(huì)影響objB的值。

deepCopy(objB, objA);
objB.b.c()  // 結(jié)果為c
objA.b.c = function () {
  console.log("d");
}
objB.b.c()  // 結(jié)果仍舊為c

這就是深復(fù)制與淺復(fù)制的區(qū)別,其實(shí)在本質(zhì)上是一樣的,感興趣的可以研究jQuery的$.extend()的源碼。

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/88130.html

相關(guān)文章

  • 關(guān)于js的淺拷貝與深拷貝

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

    summerpxy 評(píng)論0 收藏0
  • JS引用類型數(shù)據(jù)的淺拷貝與深拷貝

    摘要:拷貝到,屬性均順利拷貝。大輝小輝,小輝,大輝小輝,小輝,大輝但是,若修改的屬性變?yōu)閷?duì)象或數(shù)組時(shí),那么對(duì)象之間就會(huì)發(fā)生關(guān)聯(lián)。深拷貝不希望對(duì)象之間產(chǎn)生關(guān)聯(lián),那么這時(shí)候可以用到深拷貝。 淺拷貝 之前文章提到,在定義一個(gè)對(duì)象或數(shù)組時(shí),變量存放的往往只是一個(gè)地址。當(dāng)我們對(duì)堆內(nèi)存中的對(duì)象復(fù)制時(shí),如果屬性是對(duì)象或數(shù)組時(shí),這時(shí)候我們拷貝的只是一個(gè)棧內(nèi)存的指針。因此b對(duì)象在訪問該屬性時(shí),會(huì)根據(jù)指針尋找...

    MangoGoing 評(píng)論0 收藏0
  • JavaScript中的淺拷貝與深拷貝

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

    546669204 評(píng)論0 收藏0
  • JavaScript中的淺拷貝與深拷貝

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

    AZmake 評(píng)論0 收藏0
  • 關(guān)于JavaScript的淺拷貝和深拷貝

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

    shenhualong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<