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