簡單資料型別與複雜資料型別
阿新 • • 發佈:2022-04-12
簡單型別於複雜型別
簡單型別又叫做基本資料型別或者值型別,複雜型別又叫做引用型別。
值型別:簡單資料型別/基本資料型別,在儲存時變數中儲存的是值本身,因此叫做值型別
string ,number,boolean,undefined,null
引用型別:複雜資料型別,在儲存時變數中儲存的僅僅是地址(引用),因此叫做引用資料型別
通過 new 關鍵字建立的物件(系統物件、自定義物件),如 Object、Array、Date等
堆和棧
堆疊空間分配區別:
棧(作業系統):由作業系統自動分配釋放存放函式的引數值、區域性變數的值等。其操作方式類似於資料結構中的棧;
簡單資料型別存放到棧裡面
堆(作業系統):儲存複雜型別(物件),一般由程式設計師分配釋放,若程式設計師不釋放,由垃圾回收機制回收。
複雜資料型別存放到堆裡面
注意:JavaScript中沒有堆疊的概念,通過堆疊的方式,可以讓大家更容易理解程式碼的一些執行方式,便於將來學習其他語言。
簡單型別的記憶體分配
- 值型別(簡單資料型別): string ,number,boolean,undefined,null
- 值型別變數的資料直接存放在變數(棧空間)中
- 引用型別(複雜資料型別):通過 new 關鍵字建立的物件(系統物件、自定義物件),如 Object、Array、Date等
- 引用型別變數(棧空間)裡存放的是地址,真正的物件例項存放在堆空間中
簡單型別傳參
函式的形參也可以看做是一個變數,當我們把一個值型別變數作為引數傳給函式的形參時,其實是把變數在棧空間裡的值複製了一份給形參,那麼在方法內部對形參做任何修改,都不會影響到的外部變數。
複雜型別傳參
函式的形參也可以看做是一個變數,當我們把引用型別變數傳給形參時,其實是把變數在棧空間裡儲存的堆地址複製給了形參,形參和實參其實 儲存的是同一個堆地址,所以操作的是同一個物件。
// 複雜資料型別傳參 function Person(name) { this.name = name; } function f1(x) { // x = p console.log(x.name); // 2. 這個輸出什麼 ? 劉德華 x.name = "張學友"; console.log(x.name);// 3. 這個輸出什麼 ? 張學友 } var p = new Person("劉德華"); console.log(p.name); // 1. 這個輸出什麼 ? 劉德華 f1(p); console.log(p.name); // 4. 這個輸出什麼 ? 張學友