摘要:比如下面這個對象如何復(fù)制對象呢首先我們應(yīng)該判斷它是淺復(fù)制還是深復(fù)制。相對于深復(fù)制,淺復(fù)制非常易懂而且問題少的多。
聲明本文摘抄《你不知道的javascript》上卷 110頁。
如何復(fù)制一個對象,看起來應(yīng)該有一個內(nèi)置的copy()方法。實際上事情比你想象的更復(fù)雜,因為我們無法選擇一個默認(rèn)的復(fù)制算法。
比如下面這個對象
function fn (){} var obj = { c: true } var array = []; var myObj = { a: 2, b: obj, c: array, d: fn }; array.push(obj, myObj)
如何復(fù)制myObj對象呢?
首先我們應(yīng)該判斷它是淺復(fù)制還是深復(fù)制。
對于淺復(fù)制來說,復(fù)制出的新對象中a的值會是舊對象中的值,就是2,但是新對象中b、c、d三個屬性其實只是三個引用,他們和舊對象中b、c、d引用的對象是一樣的。
對于深復(fù)制來說,除了復(fù)制myObj以外還會復(fù)制obj、array.這時問題就來了,array引用了obj和myObj,所以又需要復(fù)制myObj,這樣就會導(dǎo)致死循環(huán)。
思考:復(fù)制一個函數(shù)意味著什么呢?有些人會通過toString()來序列化一個函數(shù)的源碼(但是結(jié)果取決于js的具體實現(xiàn),而且不同的引擎對于不同類型的函數(shù)處理方式并不完全相同)。
對于JSON安全(也就是說可以被序列化為一個JSON字符串并且可以根據(jù)這個字符串解析出一個結(jié)構(gòu)和值完全一樣的對象)的對象來說,有一種巧妙的復(fù)制方法:
var newObj = JSON.parse(JSON.stringify(someObj));
這個方法需要保證對象是JSON安全的,所以只適用于部分情況。
相對于深復(fù)制,淺復(fù)制非常易懂而且問題少的多。所以es6定義了object.assign()方法來實現(xiàn)淺復(fù)制。
object.assign({}, myObj);
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/98852.html
摘要:本文是我在復(fù)制對象方面的一些心得總結(jié),由淺復(fù)制到深復(fù)制,由只復(fù)制簡單屬性到復(fù)制,等復(fù)雜屬性,層層遞進。如有陳述不當(dāng)之處,煩請指出,不勝感激。下面是一個簡單的淺復(fù)制實現(xiàn)。 前言 從層次上來看,對象的復(fù)制可以簡單地分為淺復(fù)制和深復(fù)制,顧名思義,淺復(fù)制是指只復(fù)制一層對象的屬性,不會復(fù)制對象中的對象的屬性,對象的深復(fù)制會復(fù)制對象中層層嵌套的對象的屬性。在復(fù)制對象時,除了要復(fù)制對象的屬性外,還要...
摘要:什么是復(fù)制算法復(fù)制算法是利用空間進行分配的。另一方面,因為復(fù)制算法只搜索并復(fù)制活動對象,所以跟一般的標(biāo)記清除算法相比,它能在短時間內(nèi)完成,也就是說其吞吐量優(yōu)秀。在復(fù)制算法中,每次運行時都會執(zhí)行壓縮。 showImg(https://segmentfault.com/img/bVbdt4m?w=968&h=613); 4 GC復(fù)制算法 ??Copying GC是Marvin L.Mins...
摘要:變量表示深度復(fù)制時原始值的修正值。中的復(fù)制方法復(fù)制的方法分別是和。此處不能正確處理的深復(fù)制綜合三種方法來看不能復(fù)制對象以外的對象。 學(xué)習(xí)前端半年多了,還停留在新手村級,寫的文章可能有很多問題,思維方式和邏輯上還不夠嚴(yán)密,希望能指出問題,謝謝! ===================================================================== 數(shù)...
摘要:從而也引出了所謂的深淺復(fù)制問題。附注對于淺復(fù)制,其實還有其他的實現(xiàn)方式,比如數(shù)組中和方法,對于這些還是希望大家自己了解,本本主要針對深淺復(fù)制的實現(xiàn)原理進行解析。 前言 在之前寫繼承的過程談到了深淺復(fù)制的問題,因為有讀者反映到需要解析,趁今天周末寫一篇解析,今天的主體相對之前來說理解難度低一些,篇幅可能也比較短,諸君按需閱讀即可。 從兩種數(shù)據(jù)類型說起 在js中,變量的類型可以大致分成兩種...
摘要:定義淺復(fù)制如果復(fù)制引用,復(fù)制后的引用都是指向同一個對象的實例,彼此之間的操作會互相影響。淺復(fù)制數(shù)組淺復(fù)制利用數(shù)組方法和返回新數(shù)組特性,進行復(fù)制。深復(fù)制對象深復(fù)制利用對象的和方法。 定義 淺復(fù)制 如果復(fù)制引用,復(fù)制后的引用都是指向同一個對象的實例,彼此之間的操作會互相影響。 深復(fù)制 深復(fù)制不是簡單的復(fù)制引用,而是在堆中重新分配內(nèi)存,并且把源對象實例的所有屬性都進行新建復(fù)制,以保證深復(fù)制的...
摘要:淺復(fù)制假設(shè)有兩個對象現(xiàn)在想把對象的值復(fù)制給,由于對象的兩個值都是原始類型,用淺復(fù)制即可。深復(fù)制簡單來說深復(fù)制就是當(dāng)遇到值是對象類型的時候就再運行一遍復(fù)制。 試想這樣一種場景,自己編寫了一個js插件,調(diào)用插件時參數(shù)是以對象的形式傳入的,插件也有自己的默認(rèn)值,當(dāng)運行的時候就涉及到傳入?yún)?shù)和默認(rèn)值的合并,即用到對象的深復(fù)制和淺復(fù)制。 淺復(fù)制 假設(shè)有兩個對象 var objA = { a:...
閱讀 982·2021-11-23 09:51
閱讀 2695·2021-08-23 09:44
閱讀 656·2019-08-30 15:54
閱讀 1433·2019-08-30 13:53
閱讀 3101·2019-08-29 16:54
閱讀 2527·2019-08-29 16:26
閱讀 1186·2019-08-29 13:04
閱讀 2313·2019-08-26 13:50