JS中基礎(chǔ)數(shù)據(jù)類型和引用數(shù)據(jù)類型(轉(zhuǎn))

基本數(shù)據(jù)類型指的是簡單的數(shù)據(jù)段,引用數(shù)據(jù)類型指的是有多個值構(gòu)成的對象。當(dāng)我們把變量賦值給一個變量時,解析器首先要確認(rèn)的就是這個值是基本類型值還是引用類型值。

1、基礎(chǔ)數(shù)據(jù)類型

基礎(chǔ)數(shù)據(jù)類型有5種:Number、String 、Boolean、NullUndefined。基本數(shù)據(jù)類型是按值訪問的,因為可以直接操作保存在變量中的實際值。示例:

  var a = 10;

  var b = a;

  b = 20;

  console.log(a); // 10值

上面,b獲取的是a值得一份拷貝,雖然,兩個變量的值相等,但是兩個變量保存了兩個不同的基本數(shù)據(jù)類型值。

b只是保存了a復(fù)制的一個副本。所以,b的改變,對a沒有影響。

下圖演示了這種基本數(shù)據(jù)類型賦值的過程:

棧內(nèi)存

基礎(chǔ).PNG

2、引用數(shù)據(jù)類型

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

javascript的引用數(shù)據(jù)類型是保存在堆內(nèi)存中的對象。

與其他語言的不同是,你不可以直接訪問堆內(nèi)存空間中的位置和操作堆內(nèi)存空間。只能操作對象在棧內(nèi)存中的引用地址。

所以,引用類型數(shù)據(jù)在棧內(nèi)存中保存的實際上是對象在堆內(nèi)存中的引用地址。通過這個引用地址可以快速查找到保存中堆內(nèi)存中的對象。

  var obj1 = new Object();

  var obj2 = obj1;

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

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

說明這兩個引用數(shù)據(jù)類型指向了同一個堆內(nèi)存對象。obj1賦值給onj2,實際上這個堆內(nèi)存對象在棧內(nèi)存的引用地址復(fù)制了一份給了obj2,

但是實際上他們共同指向了同一個堆內(nèi)存對象。實際上改變的是堆內(nèi)存對象。

下面我們來演示這個引用數(shù)據(jù)類型賦值過程:

堆內(nèi)存

引用數(shù)據(jù)類型.PNG

3、總結(jié)區(qū)別

a 聲明變量時不同的內(nèi)存分配:

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

這是因為這些原始類型占據(jù)的空間是固定的,所以可將他們存儲在較小的內(nèi)存區(qū)域 – 棧中。這樣存儲便于迅速查尋變量的值。

2)引用值:存儲在堆(heap)中的對象,也就是說,存儲在變量處的值是一個指針(point),指向存儲對象的內(nèi)存地址。

這是因為:引用值的大小會改變,所以不能把它放在棧中,否則會降低變量查尋的速度。相反,放在變量的??臻g中的值是該對象存儲在堆中的地址。

地址的大小是固定的,所以把它存儲在棧中對變量性能無任何負(fù)面影響。

b 不同的內(nèi)存分配機(jī)制也帶來了不同的訪問機(jī)制
   
  1)在javascript中是不允許直接訪問保存在堆內(nèi)存中的對象的,所以在訪問一個對象時,
    首先得到的是這個對象在堆內(nèi)存中的地址,然后再按照這個地址去獲得這個對象中的值,這就是傳說中的按引用訪問。
  2)而原始類型的值則是可以直接訪問到的。
  
  c 復(fù)制變量時的不同
  
  1)原始值:在將一個保存著原始值的變量復(fù)制給另一個變量時,會將原始值的副本賦值給新變量,此后這兩個變量是完全獨立的,他們只是擁有相同的value而已。
  2)引用值:在將一個保存著對象內(nèi)存地址的變量復(fù)制給另一個變量時,會把這個內(nèi)存地址賦值給新變量,
    也就是說這兩個變量都指向了堆內(nèi)存中的同一個對象,他們中任何一個作出的改變都會反映在另一個身上。
   ?。ㄟ@里要理解的一點就是,復(fù)制對象時并不會在堆內(nèi)存中新生成一個一模一樣的對象,只是多了一個保存指向這個對象指針的變量罷了)。多了一個指針
 
  d 參數(shù)傳遞的不同(把實參復(fù)制給形參的過程)
  
  首先我們應(yīng)該明確一點:ECMAScript中所有函數(shù)的參數(shù)都是按值來傳遞的。
  但是為什么涉及到原始類型與引用類型的值時仍然有區(qū)別呢?還不就是因為內(nèi)存分配時的差別。  
  1)原始值:只是把變量里的值傳遞給參數(shù),之后參數(shù)和這個變量互不影響。
  2)引用值:對象變量它里面的值是這個對象在堆內(nèi)存中的內(nèi)存地址,這一點你要時刻銘記在心!
    因此它傳遞的值也就是這個內(nèi)存地址,這也就是為什么函數(shù)內(nèi)部對這個參數(shù)的修改會體現(xiàn)在外部的原因了,因為它們都指向同一個對象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,789評論 11 349
  • JVM內(nèi)存模型Java虛擬機(jī)(Java Virtual Machine=JVM)的內(nèi)存空間分為五個部分,分別是: ...
    光劍書架上的書閱讀 2,774評論 2 26
  • 前言 不知道大家有沒有這樣一種感覺,程序員的數(shù)量井噴了??赡苁且驗榛ヂ?lián)網(wǎng)火了,也可能是各家培訓(xùn)機(jī)構(gòu)為我們拉來了大量...
    活這么大就沒飽過閱讀 2,837評論 6 25
  • 一直以來,臉是我最容易瘦下來的部位。然而我不想瘦臉,可能會被一些同志拍死。 我覺得臉胖的人有福氣,身邊的同事親友也...
    紅棗喝閱讀 277評論 0 0
  • 愛情,是這個世界上最致命的毒藥。 ————題記 [00序言] “我的出生,就是世界的開始。我的死亡,就是世界末日。...
    Tiamo佳期如夢閱讀 705評論 0 1

友情鏈接更多精彩內(nèi)容