jQuery深拷貝和淺拷貝詳解

在瞭解深拷貝和淺拷貝之前首先要明白數據在內存中是如何存放的

在js中,數據可以分爲基本數據類型(字符串(String)、數字(Number)、布爾(Boolean)、對空(Null)、未定義(Undefined))和複雜數據類型(對象(Object)、數組(Array)、函數(Function))。

在定義變量時,基本數據類型會存放在內存的棧中,而複雜數據類型會存放在內存的堆中,由棧中的名字指向隊中的地址。例如下圖:

在這裏插入圖片描述
明白了基本數據類型和複雜數據類型之後就可以研究深拷貝和淺拷貝的問題了

jQuery的$.extend();用法

$.extend( [deep ], target, object1 [, objectN ] )

第一個屬性可以設定是深拷貝還是淺拷貝,true的話就是深拷貝。默認flase淺拷貝。

淺拷貝:
在拷貝基本數據類型時,會在棧中生成和被拷貝對象一樣的變量名和值,如果遇到相同的屬性,拷貝對象的屬性值會覆蓋掉自己原本的屬性值。而在淺拷貝複雜數據類型時,只把複雜數據類型在堆中的地址拷貝給新變量,這時被拷貝的複雜變量和新拷貝出來的複雜類型對象都指向這個複雜對象的地址。例下圖。這時無論改變小麗的age,還是改變小紅的age,另外的一個人的會隨之改變。相當於兩個人公用一套數據。
在這裏插入圖片描述
深拷貝:
在深拷貝中,無論是基本數據類型還是複雜數據類型,都會完全的拷貝一份數據給到新的變量,複雜數據會在堆中重新開闢一個地址,讓新變量指向新的地址而不是指向之前自己的地址,例下圖。這樣兩個變量都指向自己的地址,更改數據不會影響到對方的數據的變化。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章