JavaScript中基礎資料型別 (Elementary Data Type)和引用資料類型的區別

來源:互聯網
上載者:User

標籤:相同   現在   color   var   www.   基本資料   不同類   ons   效能   

1、基礎資料型別 (Elementary Data Type)和引用資料類型

  ECMAScript包括兩個不同類型的值:基礎資料型別 (Elementary Data Type)和引用資料類型。

  基礎資料型別 (Elementary Data Type)指的是簡單的資料區段,引用資料類型指的是有多個值構成的對象。

  當我們把變數賦值給一個變數時,解析器首先要確認的就是這個值是基本類型值還是參考型別值。

2、常見的基礎資料型別 (Elementary Data Type):

  Number、String 、Boolean、Null和Undefined。基礎資料型別 (Elementary Data Type)是按值訪問的,因為可以直接操作儲存在變數中的實際值。樣本:

  var a = 10;

  var b = a;

  b = 20;

  console.log(a); // 10值

  上面,b擷取的是a值得一份拷貝,雖然,兩個變數的值相等,但是兩個變數儲存了兩個不同的基礎資料型別 (Elementary Data Type)值。

  b只是儲存了a複製的一個副本。所以,b的改變,對a沒有影響。

 

  示範了這種基礎資料型別 (Elementary Data Type)賦值的過程:

 

 

 

3、參考型別資料:

  也就是物件類型Object type,比如:Object 、Array 、Function 、Data等。

  javascript的引用資料類型是儲存在堆記憶體中的對象。

  與其他語言的不同是,你不可以直接存取堆記憶體空間中的位置和操作堆記憶體空間。只能操作對象在棧記憶體中的引用地址。

  所以,參考型別資料在棧記憶體中儲存的實際上是對象在堆記憶體中的引用地址。通過這個引用地址可以快速尋找到儲存中堆記憶體中的對象。

  var obj1 = new Object();

  var obj2 = obj1;

  obj2.name = "我有名字了";

  console.log(obj1.name); // 我有名字了

  說明這兩個引用資料類型指向了同一個堆記憶體對象。obj1賦值給onj2,實際上這個堆記憶體對象在棧記憶體的引用地址複製了一份給了obj2,

  但是實際上他們共同指向了同一個堆記憶體對象。實際上改變的是堆記憶體對象。

 

  下面我們來示範這個引用資料類型賦值過程:

 

 

 

4、總結區別

  a 聲明變數時不同的記憶體配置: 

  1)原始值:儲存在棧(stack)中的簡單資料區段,也就是說,它們的值直接儲存在變數訪問的位置。

    這是因為這些原始類型佔據的空間是固定的,所以可將他們儲存在較小的記憶體地區 – 棧中。這樣儲存便於迅速查尋變數的值。

  2)引用值:儲存在堆(heap)中的對象,也就是說,儲存在變數處的值是一個指標(point),指向儲存物件的記憶體位址。

     這是因為:引用值的大小會改變,所以不能把它放在棧中,否則會降低變數查尋的速度。相反,放在變數的棧空間中的值是該Object Storage Service在堆中的地址。

     地址的大小是固定的,所以把它儲存在棧中對變數效能無任何負面影響。

  b 不同的記憶體配置機制也帶來了不同的訪問機制
     1)在javascript中是不允許直接存取儲存在堆記憶體中的對象的,所以在訪問一個對象時,    首先得到的是這個對象在堆記憶體中的地址,然後再按照這個地址去獲得這個對象中的值,這就是傳說中的按引用訪問。  2)而原始類型的值則是可以直接存取到的。    c 複製變數時的不同    1)原始值:在將一個儲存著原始值的變數複製給另一個變數時,會將原始值的副本賦值給新變數,此後這兩個變數是完全獨立的,他們只是擁有相同的value而已。  2)引用值:在將一個儲存著對象記憶體位址的變數複製給另一個變數時,會把這個記憶體位址賦值給新變數,    也就是說這兩個變數都指向了堆記憶體中的同一個對象,他們中任何一個作出的改變都會反映在另一個身上。    (這裡要理解的一點就是,複製對象時並不會在堆記憶體中新產生一個一模一樣的對象,只是多了一個儲存指向這個對象指標的變數罷了)。多了一個指標   d 參數傳遞的不同(把實參複製給形參的過程)    首先我們應該明確一點:ECMAScript中所有函數的參數都是按值來傳遞的。  但是為什麼涉及到原始類型與參考型別的值時仍然有區別呢?還不就是因為記憶體配置時的差別。    1)原始值:只是把變數裡的值傳遞給參數,之後參數和這個變數互不影響。  2)引用值:物件變數它裡面的值是這個對象在堆記憶體中的記憶體位址,這一點你要時刻銘記在心!    因此它傳遞的值也就是這個記憶體位址,這也就是為什麼函數內部對這個參數的修改會體現在外部的原因了,因為它們都指向同一個對象。 文章來自連結地址:https://www.cnblogs.com/cxying93/p/6106469.html

JavaScript中基礎資料型別 (Elementary Data Type)和引用資料類型的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.