摘要:對象的深淺拷貝針對于的對象和數(shù)組數(shù)組也是對象淺拷貝只是引用,內(nèi)存不變而深拷貝就是遞歸賦值。往往需要深拷貝的對象里沒有函數(shù),也不需要拷貝它原型鏈上的屬性。
js對象的深淺拷貝
針對于JavaScript的對象和數(shù)組(數(shù)組也是對象)淺拷貝只是引用,內(nèi)存不變;而深拷貝就是遞歸賦值。
深拷貝是不同內(nèi)存,相互獨立。而淺拷貝會影響
//1.循環(huán)復(fù)制數(shù)組 var arr = [1,2,3],arr2 = []; for(var i=0;i別急著走,利用window.JSON的方法做深拷貝存在2個 缺點:
如果你的對象里有函數(shù),函數(shù)無法被拷貝下來
無法拷貝對象原型鏈上的屬性和方法
例如下面這種情況:對象里包含函數(shù)
var o1 = { name:"小明", age:12, city:"廣州", schools:["小學(xué)","中學(xué)","大學(xué)"], say:function(){ alert(this.name); } }for...in 遍歷對象,找出自身的屬性,且會搜索原型,即也會查找原型上的屬性
__proto__不可枚舉的屬性obj.hasOwnProperty() 返回布爾值 判斷屬性是否是自有屬性
JSON.parse(JSON.stringify(o1)) 可以將只有屬性/不存在方法的對象復(fù)制
JSON.stringify 將對象轉(zhuǎn)換成字符串,轉(zhuǎn)換的過程,會忽略掉方法.//下面的方法可以實現(xiàn) 深深度復(fù)制(復(fù)制包括函數(shù))
function deepClone(oldObj){ var newObj = {}; for(var key in oldObj){ if(oldObj.hasOwnProperty(key)){ if(oldObj[key].constructor == Array){ //判斷oldObj[key]值是否數(shù)組/對象 newObj[key] = oldObj[key].slice(); }else if(oldObj[key].constructor == Object){ newObj[key] == deepClone(oldObj[key]); }else{ newObj[key] = oldObj[key]; } } } return newObj; } var o2 = deepClone(o1);當(dāng)然,你明確知道他們的缺點后,如果他的缺點對你的業(yè)務(wù)需求沒有影響,就可以放心使用了,一行原生代碼就搞定。
js堆棧
目前我在開發(fā)業(yè)務(wù)場景中,大多還真可以忽略上面2個缺點。往往需要深拷貝的對象里沒有函數(shù),也不需要拷貝它原型鏈上的屬性。由于js中的對象都是復(fù)雜數(shù)據(jù)類型,這種數(shù)據(jù)在內(nèi)存中存儲的時候,存放在堆中。當(dāng)簡單賦值的時候,其實是將該對象的指針指向同一個堆地址。
簡單的數(shù)據(jù)類型存放在棧中,當(dāng)對簡單的數(shù)據(jù)類型進(jìn)行賦值的時候,其實就是直接在棧中新開辟一個地方專門存儲一樣的值。數(shù)據(jù)結(jié)構(gòu)里的堆棧:
棧(stack): 由編譯器自動分配, 存放函數(shù)的參數(shù)值, 局部變量的值等. 其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧.
堆(heap): 一般由程序員分配釋放, 若程序員不釋放, 程序結(jié)束時可能由OS回收. 這里OS是指: 操作系統(tǒng)(Operating System)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/102169.html
摘要:在之前的文章專題之?dāng)?shù)據(jù)類型和類型檢測中我有講過,中的數(shù)據(jù)類型分為兩種,基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,基本數(shù)據(jù)類型是保存在棧的數(shù)據(jù)結(jié)構(gòu)中的是按值訪問,所以不存在深淺拷貝問題。 前言 在開發(fā)過程中,偶爾會遇到這種場景,拿到一個數(shù)據(jù)后,你打算對它進(jìn)行處理,但是你又希望拷貝一份副本出來,方便數(shù)據(jù)對比和以后恢復(fù)數(shù)據(jù)。 那么這就涉及到了 JS 中對數(shù)據(jù)的深淺拷貝問題,所謂深淺拷貝,淺拷貝的意思就是,...
摘要:深拷貝相比于淺拷貝速度較慢并且花銷較大。所以在賦值完成后,在棧內(nèi)存就有兩個指針指向堆內(nèi)存同一個數(shù)據(jù)。結(jié)果如下擴(kuò)展運算符只能對一層進(jìn)行深拷貝如果拷貝的層數(shù)超過了一層的話,那么就會進(jìn)行淺拷貝那么我們可以看到和展開原算符對于深淺拷貝的結(jié)果是一樣。 JS中數(shù)據(jù)類型 基本數(shù)據(jù)類型: undefined、null、Boolean、Number、String和Symbol(ES6) 引用數(shù)據(jù)類型:...
摘要:正文討論深淺拷貝,首先要從的基本數(shù)據(jù)類型說起根據(jù)中的變量類型傳遞方式,分為值類型和引用類型,值類型變量包括。當(dāng)你拷貝的對象有多級的時候,就是深拷貝。數(shù)據(jù)不存在則對其拷貝。 前言: 本文主要閱讀對象:對深淺拷貝印象模糊對初級前端,想對js深淺拷貝聊一聊的中級前端。 如果是對這些有完整對認(rèn)知體系和解決方法的大佬,可以選擇略過。 正文: 討論深淺拷貝,首先要從js的基本數(shù)據(jù)類型說起: 根據(jù) J...
摘要:基本數(shù)據(jù)類型的復(fù)制很簡單,就是賦值操作,所以深淺拷貝也是針對,這類引用類型數(shù)據(jù)。它會拋棄對象的。另外,查資料過程中還看到這么一個詞結(jié)構(gòu)化克隆算法還有這一篇資料也有參考,也寫得比較詳細(xì)了的深淺拷貝 基本數(shù)據(jù)類型的復(fù)制很簡單,就是賦值操作,所以深淺拷貝也是針對Object,Array這類引用類型數(shù)據(jù)。 淺拷貝對于字符串來說,是值的復(fù)制,而對于對象來說則是對對象地址的復(fù)制;而深拷貝的話,它不...
閱讀 3627·2023-04-26 02:32
閱讀 3905·2021-11-23 10:05
閱讀 2291·2021-10-08 10:04
閱讀 2711·2021-09-22 16:06
閱讀 3612·2021-09-22 15:27
閱讀 764·2019-08-30 15:54
閱讀 1698·2019-08-30 13:50
閱讀 2704·2019-08-29 13:56