js基本型別與引用型別,淺拷貝和深拷貝

2022-02-19 13:23:48 字數 3856 閱讀 7012

1. 基本型別: string,number,boolean,null,undefined

2. 引用型別: function,array,object

基本型別:存放在棧記憶體中的簡單資料段,資料大小確定,記憶體空間大小可以分配。

5種基本資料型別有undefined、null、boolean、numberstring,它們是直接按值存放的,所以可以直接訪問。

引用型別:存放在堆記憶體中的物件,變數實際儲存的是乙個指標,這個指標指向另乙個位置。每個空間大小不一樣,要根據情況開進行特定的分配。

當我們需要訪問引用型別(如物件,陣列,函式等)的值時,首先從棧中獲得該物件的位址指標,然後再從堆記憶體中取得所需的資料。

訪問方式

基本型別              

引用型別

操作和儲存在變數的實際的值

值儲存在記憶體中,js不允許直接訪問記憶體,在操作的時候,操作的是物件的引用

儲存的位置

基本型別 

引用型別

儲存在棧區

引用存放在棧區,實際物件儲存在堆區

改變量值

b[4] = 6;

c = 7;

alert(a[4]);//

6 alert(a[0]);//

1從上面我們可以得知,當我改變b中的資料時,a中資料也發生了變化;但是當我改變c的資料值時,a卻沒有發生改變。

這就是傳值與傳址的區別。因為a是陣列,屬於引用型別,所以它賦予給b的時候傳的是棧中的位址(相當於新建了乙個不同名「指標」),而不是堆記憶體中的物件。而c僅僅是從a堆記憶體中獲取的乙個資料值,並儲存在棧中。所以b修改的時候,會根據位址回到a堆中修改,c則直接在棧中修改,並且不能指向a堆記憶體中。

引用型別,傳的是棧中的位址。

3、淺拷貝

前面已經提到,在定義乙個物件或陣列時,變數存放的往往只是乙個位址。當我們使用物件拷貝時,如果屬性是物件或陣列時,這時候我們傳遞的也只是乙個位址。因此子物件在訪問該屬性時,會根據位址回溯到父物件指向的堆記憶體中,即父子物件發生了關聯,兩者的屬性值會指向同一記憶體空間。

var a =

function

copy(p) ;

for (var i in

p)

return

c;  }

a.key2 = ['小輝','小輝'];

var b =copy(a);

b.key3 = '33333';

alert(b.key1);

//1111111

alert(b.key3); //

33333

alert(a.key3); //

undefined

a物件中key1屬性是字串,key2屬性是陣列。a拷貝到b,12屬性均順利拷貝。給b物件新增乙個字串型別的屬性key3時,b能正常修改,而a中無定義。說明子物件的key3(基本型別)並沒有關聯到父物件中,所以undefined。

1 b.key2.push("大輝");

2 alert(b.key2); //

小輝,小輝,大輝

3 alert(a.key2); //

小輝,小輝,大輝

但是,若修改的屬性變為物件或陣列時,那麼父子物件之間就會發生關聯。從以上彈出結果可知,我對b物件進行修改,a、b的key2屬性值(陣列)均發生了改變。其在記憶體的狀態,可以用下圖來表示。

原因是key1的值屬於基本型別,所以拷貝的時候傳遞的就是該資料段;但是key2的值是堆記憶體中的物件,所以key2在拷貝的時候傳遞的是指向key2物件的位址,無論複製多少個key2,其值始終是指向父物件的key2物件的記憶體空間。

4、深拷貝

或許以上並不是我們在實際編碼中想要的結果,我們不希望父子物件之間產生關聯,那麼這時候可以用到深拷貝。既然屬性值型別是陣列和或象時只會傳址,那麼我們就用遞迴來解決這個問題,把父物件中所有屬於物件的屬性型別都遍歷賦給子物件即可。測試**如下:

1

function

copy(p, c) ;

3for (var i in

p) ;

6copy(p[i], c[i]);

7   } else10}

11return

c;12

}

13 a.key2 = ['小輝','小輝'];

14var b={};

15 b =copy(a,b);

16 b.key2.push("大輝");

17 alert(b.key2); //

小輝,小輝,大輝

18 alert(a.key2); //

小輝,小輝

由上可知,修改b的key2陣列時,沒有使a父物件中的key2陣列新增乙個值,即子物件沒有影響到父物件a中的key2。其儲存模式大致如下:

js的單執行緒:

js的陣列實現佇列與堆疊的方法:

js執行上下文:

上下文作用域:

訪問方式

基本型別              

引用型別

操作和儲存在變數的實際的值

值儲存在記憶體中,js不允許直接訪問記憶體,在操作的時候,操作的是物件的引用

儲存的位置

基本型別 

引用型別

儲存在棧區

引用存放在棧區,實際物件儲存在堆區

js 引用型別和基本型別

js中的資料型別有以下幾種 基本型別 number boolean string undefined null symbol 引用型別 object array,function,date,正則物件,json物件 基本型別的資料是存放在棧記憶體中的,而引用型別的資料是存放在堆記憶體中的 複製變數值 ...

js 引用型別和基本型別

js中的資料型別有以下幾種 number boolean undefined object function string null 基本型別 number boolean string undefined null 引用型別 object function 基本型別的資料是存放在棧記憶體中的,而引...

js 基本型別 引用型別

1 基本的資料型別有 undefined,boolean,number,string,null.基本型別的訪問是按值訪問的,就是說你可以操作儲存在變數中的實際的值 基本型別的比較是值的比較。用 比較兩個不同型別的變數時會進行一些型別轉換。但是當兩個值的型別相同的時候,即使是 也相當於是 基本型別的變...