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

資訊專欄INFORMATION COLUMN

對(duì)象復(fù)制

Eidesen / 3488人閱讀

摘要:比如下面這個(gè)對(duì)象如何復(fù)制對(duì)象呢首先我們應(yīng)該判斷它是淺復(fù)制還是深復(fù)制。相對(duì)于深復(fù)制,淺復(fù)制非常易懂而且問(wèn)題少的多。

聲明本文摘抄《你不知道的javascript》上卷 110頁(yè)。
如何復(fù)制一個(gè)對(duì)象,看起來(lái)應(yīng)該有一個(gè)內(nèi)置的copy()方法。實(shí)際上事情比你想象的更復(fù)雜,因?yàn)槲覀儫o(wú)法選擇一個(gè)默認(rèn)的復(fù)制算法。
比如下面這個(gè)對(duì)象

function fn (){}
var obj = {
    c: true
}
var array = [];
var myObj = {
    a: 2,
    b: obj,
    c: array,
    d: fn
};
array.push(obj, myObj)

如何復(fù)制myObj對(duì)象呢?

首先我們應(yīng)該判斷它是淺復(fù)制還是深復(fù)制。
對(duì)于淺復(fù)制來(lái)說(shuō),復(fù)制出的新對(duì)象中a的值會(huì)是舊對(duì)象中的值,就是2,但是新對(duì)象中b、c、d三個(gè)屬性其實(shí)只是三個(gè)引用,他們和舊對(duì)象中b、c、d引用的對(duì)象是一樣的。
對(duì)于深復(fù)制來(lái)說(shuō),除了復(fù)制myObj以外還會(huì)復(fù)制obj、array.這時(shí)問(wèn)題就來(lái)了,array引用了obj和myObj,所以又需要復(fù)制myObj,這樣就會(huì)導(dǎo)致死循環(huán)。

思考:復(fù)制一個(gè)函數(shù)意味著什么呢?有些人會(huì)通過(guò)toString()來(lái)序列化一個(gè)函數(shù)的源碼(但是結(jié)果取決于js的具體實(shí)現(xiàn),而且不同的引擎對(duì)于不同類型的函數(shù)處理方式并不完全相同)。
對(duì)于JSON安全(也就是說(shuō)可以被序列化為一個(gè)JSON字符串并且可以根據(jù)這個(gè)字符串解析出一個(gè)結(jié)構(gòu)和值完全一樣的對(duì)象)的對(duì)象來(lái)說(shuō),有一種巧妙的復(fù)制方法:

var newObj = JSON.parse(JSON.stringify(someObj));

這個(gè)方法需要保證對(duì)象是JSON安全的,所以只適用于部分情況。

相對(duì)于深復(fù)制,淺復(fù)制非常易懂而且問(wèn)題少的多。所以es6定義了object.assign()方法來(lái)實(shí)現(xiàn)淺復(fù)制。

object.assign({}, myObj);



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

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

相關(guān)文章

  • JavaScript對(duì)象的深淺復(fù)制

    摘要:本文是我在復(fù)制對(duì)象方面的一些心得總結(jié),由淺復(fù)制到深復(fù)制,由只復(fù)制簡(jiǎn)單屬性到復(fù)制,等復(fù)雜屬性,層層遞進(jìn)。如有陳述不當(dāng)之處,煩請(qǐng)指出,不勝感激。下面是一個(gè)簡(jiǎn)單的淺復(fù)制實(shí)現(xiàn)。 前言 從層次上來(lái)看,對(duì)象的復(fù)制可以簡(jiǎn)單地分為淺復(fù)制和深復(fù)制,顧名思義,淺復(fù)制是指只復(fù)制一層對(duì)象的屬性,不會(huì)復(fù)制對(duì)象中的對(duì)象的屬性,對(duì)象的深復(fù)制會(huì)復(fù)制對(duì)象中層層嵌套的對(duì)象的屬性。在復(fù)制對(duì)象時(shí),除了要復(fù)制對(duì)象的屬性外,還要...

    B0B0 評(píng)論0 收藏0
  • GC_4_GC復(fù)制算法

    摘要:什么是復(fù)制算法復(fù)制算法是利用空間進(jìn)行分配的。另一方面,因?yàn)閺?fù)制算法只搜索并復(fù)制活動(dòng)對(duì)象,所以跟一般的標(biāo)記清除算法相比,它能在短時(shí)間內(nèi)完成,也就是說(shuō)其吞吐量?jī)?yōu)秀。在復(fù)制算法中,每次運(yùn)行時(shí)都會(huì)執(zhí)行壓縮。 showImg(https://segmentfault.com/img/bVbdt4m?w=968&h=613); 4 GC復(fù)制算法 ??Copying GC是Marvin L.Mins...

    elarity 評(píng)論0 收藏0
  • 復(fù)制、淺復(fù)制與JQuery中的插件開發(fā)

    摘要:變量表示深度復(fù)制時(shí)原始值的修正值。中的復(fù)制方法復(fù)制的方法分別是和。此處不能正確處理的深復(fù)制綜合三種方法來(lái)看不能復(fù)制對(duì)象以外的對(duì)象。 學(xué)習(xí)前端半年多了,還停留在新手村級(jí),寫的文章可能有很多問(wèn)題,思維方式和邏輯上還不夠嚴(yán)密,希望能指出問(wèn)題,謝謝! ===================================================================== 數(shù)...

    sewerganger 評(píng)論0 收藏0
  • 詳解js深淺復(fù)制

    摘要:從而也引出了所謂的深淺復(fù)制問(wèn)題。附注對(duì)于淺復(fù)制,其實(shí)還有其他的實(shí)現(xiàn)方式,比如數(shù)組中和方法,對(duì)于這些還是希望大家自己了解,本本主要針對(duì)深淺復(fù)制的實(shí)現(xiàn)原理進(jìn)行解析。 前言 在之前寫繼承的過(guò)程談到了深淺復(fù)制的問(wèn)題,因?yàn)橛凶x者反映到需要解析,趁今天周末寫一篇解析,今天的主體相對(duì)之前來(lái)說(shuō)理解難度低一些,篇幅可能也比較短,諸君按需閱讀即可。 從兩種數(shù)據(jù)類型說(shuō)起 在js中,變量的類型可以大致分成兩種...

    Lin_YT 評(píng)論0 收藏0
  • Javascript系列之淺復(fù)制與深復(fù)制

    摘要:定義淺復(fù)制如果復(fù)制引用,復(fù)制后的引用都是指向同一個(gè)對(duì)象的實(shí)例,彼此之間的操作會(huì)互相影響。淺復(fù)制數(shù)組淺復(fù)制利用數(shù)組方法和返回新數(shù)組特性,進(jìn)行復(fù)制。深復(fù)制對(duì)象深復(fù)制利用對(duì)象的和方法。 定義 淺復(fù)制 如果復(fù)制引用,復(fù)制后的引用都是指向同一個(gè)對(duì)象的實(shí)例,彼此之間的操作會(huì)互相影響。 深復(fù)制 深復(fù)制不是簡(jiǎn)單的復(fù)制引用,而是在堆中重新分配內(nèi)存,并且把源對(duì)象實(shí)例的所有屬性都進(jìn)行新建復(fù)制,以保證深復(fù)制的...

    MonoLog 評(píng)論0 收藏0
  • 解析js對(duì)象的淺復(fù)制與深復(fù)制原理

    摘要:淺復(fù)制假設(shè)有兩個(gè)對(duì)象現(xiàn)在想把對(duì)象的值復(fù)制給,由于對(duì)象的兩個(gè)值都是原始類型,用淺復(fù)制即可。深復(fù)制簡(jiǎn)單來(lái)說(shuō)深復(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:...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<