目錄
目標
簡單型別與復雜型別
值型別
參考型別
堆和堆疊
簡單型別的記憶體分配
復雜型別的記憶體分配
簡單型別傳參
復雜型別傳參
目標
- 能夠說出簡單資料型別的記憶體分配
- 能夠說出復雜資料型別的記憶體分配
- 能夠說出簡單資料型別如何傳參
- 能夠說出復雜資料型別如何傳參
簡單型別與復雜型別
- 簡單資料型別又稱為基本資料型別或者值型別
- 復雜資料型別又稱為參考型別
值型別
- 值型別:簡單資料型別 / 基本資料型別,在存盤時變數中存盤的是值本身,因此叫做值型別
- 五大資料型別(值型別):string,number,boolean,undefined,null
- 其中 null 比較特殊,回傳型別為 object
<script>
// 簡單資料型別 null
// 回傳的是空的物件 object
var empty = null;
console.log(typeof empty);
// null 的使用
// 如果定義某個變數為物件,但是賦值并不確定,此時可以將 null 賦給這個變數
</script>
參考型別
- 復雜資料型別,在存盤變數中存盤的僅僅是地址(參考),因此稱為參考型別
- 通過 new 關鍵字創建的物件(系統物件、自定義物件),如 object、array、date 等
堆和堆疊
堆疊空間分配區別:
- 堆疊(作業系統):由作業系統自動分配釋放存放函式的引數值、區域變數的值等
- 其操作方式類似于資料結構中的堆疊
- 簡單資料型別存放到堆疊中
- 堆(作業系統):存盤復雜型別(物件),一般由程式員分配釋放
- 若程式員不釋放,由垃圾回識訓制回收
- 復雜資料型別存放到堆里面
注意:
- 堆和堆疊是記憶體中兩塊互不干預的獨立的空間
- JavaScript 中沒有堆和堆疊的概念
- 這里只是通過堆和堆疊的方式,幫助理解 JavaScript 代碼的一些執行方式
簡單型別的記憶體分配
- 值型別(簡單資料型別):string,number,boolean,undefined,null
- 值型別變數的資料直接存放在變數(堆疊空間)中

復雜型別的記憶體分配
- 參考型別(復雜資料型別):通過 new 關鍵字創建的物件(系統物件、自定義物件)
- 如 object、array、date 等
- 參考型別在堆疊中存放變數(地址),十六進制表示
- 真正的物件實體存放在堆空間中

簡單型別傳參
- 函式的形參也可以看作是一個變數
- 當我們把一個值型別變數作為引數傳給函式的形參時,其實就是把變數在堆疊空間的值復制了一份給形參
- 因此在方法內部對形參做任何修改,都不會影響到外部的變數
<script>
function fun(a) {
a++;
console.log(a); // a = 11
}
var x = 10;
// 將實參 x 傳遞給形參 a
// 本質是復制一份 x = 10 傳遞給 a,x 本身的值并不會隨著 a 的變化而變化
// 即在方法內部對形參(a)做任何修改,都不會影響外部的變數(x)
fun(x);
console.log(x); // x = 10
</script>
復雜型別傳參
- 復雜資料型別在將實參傳給形參的程序中,傳遞給形參的是實參的地址,而不是物件實體
<script>
function Person(name) {
this.name = name;
}
function fun1(x) {
// 8.由于形參 x 指向 地址p,因此輸出的仍然是 地址p 所對應的物件實體{new Person('劉德華'); name = '劉德華'}
// 9.第二個輸出:'劉德華'
console.log(x.name);
// 10.對 x.name 進行了重新的賦值,此時的物件實體改為{new Person('劉德華'); name = '張學友'}
x.name = '張學友';
// 11.第三個輸出:'張學友'
console.log('2' + x.name);
}
// 1.定義一個復雜資料型別
// 2.復雜資料型別 變數 p 在堆疊中存盤 地址p,變數 p 指向 地址p
// 3.而真正的物件實體{new Person('劉德華'); name = '劉德華'}存放在堆中
// 4.變數 p 指向堆疊中的地址p,地址p 指向堆中的物件實體{new Person('劉德華'); name = '劉德華'}
var p = new Person('劉德華');
// 5.第一個輸出:劉德華
console.log(p.name);
// 6.將變數 p 傳遞給形參 x,即將 地址p 傳遞給形參 x
// 7.然后變數 p 和形參 x 都指向了同一個地址,即 地址p
fun1(p);
// 12.此時 p.name 的物件實體為{new Person('劉德華'); name = '張學友'}
// 13.第四個輸出:'張學友'
console.log(p.name);
</script>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/289316.html
標籤:其他
