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