論基本資料型別與引用資料型別以及深淺拷貝的區別

2022-06-15 08:24:14 字數 1574 閱讀 2743

一、資料型別

js有兩種資料型別

2. 棧(stack)與 堆(heap)的概念

3. 這兩類資料型別的儲存方式

變a的同時b沒有發生改變,因此接下來分析一下產生這種變化的原因:

當 b = a 時,棧會新開闢乙個記憶體,如下:

所以當你此時修改a=2,對b並不會造成影響,因為此時的b已自食其力,翅膀硬了,不受a的影響了。

當然,let a=1,b=a;雖然b不受a影響,但這也算不上深拷貝,因為深拷貝本身只針對較為複雜的object型別資料。

變a的同時b也發生了改變,因此接下來分析一下產生這種變化的原因:

當b拷貝a時,即 b = a ,複製的是a的引用位址,而不是堆記憶體裡面的值;

而當我們 a[0] = 22 進行陣列修改時,由於a與b指向的是同乙個位址,因此b也受了影響,這就是所謂的 「淺拷貝」;

但是當我們在堆記憶體中也去開闢乙個新的記憶體,用來專門為b存放值,就像基本型別那樣,豈不就達到深拷貝的效果了;

4、「深拷貝」的實現方式

缺點:丟失constructor,regexp無法實現

輸出結果為:

輸出結果為:

lodash是乙個很熱門的函式庫,提供了 lodash.clonedeep()實現深拷貝,但是一旦拷貝一些很複雜的物件就有可能報錯。比如用clonedeep轉殖乙個vue例項,就有可能報key.charat is not a function的錯。(正確的拷貝方法是vue.extend())。

二、參考位址

基本資料型別與引用資料型別

基本資料型別與引用資料型別 基本資料型別 基本資料型別 大小 範圍 預設值 int 整形 32 2147483648 2147483648 0 long 長整形 64 9233372036854477808 9233372036854477808 0 float 浮點形 32 3.40292347e...

基本資料型別與引用資料型別

byte short int long float double boolean charstring class sun提供的 system.class sun提供的 student.calss 程式設計師自定義的 user.class 程式設計師自定義的 product.class程式設計師自定...

基本資料型別與引用資料型別

在談深拷貝與淺拷貝之前,我們先來談談js的資料型別,這對接下來了解深拷貝淺拷貝起到一定的作用。棧記憶體棧是自動分配相對固定大小的記憶體空間,而且由系統自動釋放的。棧是線性結構,後進先出。基本資料型別 null undefined number string boolean symbol es6 基本...