JS數(shù)據(jù)類型具體分析

在前面的一個章節(jié)中,我們講了JavaScript數(shù)據(jù)類型有哪些以及他們之間的區(qū)別。在其中我提到過JS 數(shù)據(jù)類型有分為簡單數(shù)據(jù)類型和引用數(shù)據(jù)類型。
今天,我就具體分析什么是簡單數(shù)據(jù) 類型和引用數(shù)據(jù)類型。

回顧JS數(shù)據(jù)類型

js 數(shù)據(jù)類型一共有8種,分別是Undefined、null、number、boolean、string、arry、object、function。
其中

  • 簡單數(shù)據(jù)類型有:Undefined、null、number、boolean、string;
  • 復(fù)雜數(shù)據(jù)類型:arry、object、function。

一個小例子

var a=1;
var b=a;
console.log(a+' '+b);   // 輸出1 1
b=2
console.log(a+' '+b);  // 輸出1 2
var  a=[1,2,3];
var b=a;
console.log(a+' '+b);  //輸出 1,2,3 1,2,3
a[0]=['a']
console.log(a+' '+b);  // 輸出 a,2,3 a,2,3
var  a=[1,2,3];
var b=a;
console.log(a+' '+b);  //輸出 1,2,3 1,2,3
a=['a','b','c']
console.log(a+' '+b);  // 輸出 a,b,c 1,2,3

觀察上面小例子 ,發(fā)現(xiàn)了奇怪 的現(xiàn)象。
出現(xiàn)上面現(xiàn)象的主要原因是js對內(nèi)存分配不同導(dǎo)致的。

數(shù)據(jù)類型

數(shù)據(jù)類型有:Number、String 、Boolean、Null和Undefined?;緮?shù)據(jù)類型是按值訪問的,因?yàn)榭梢灾苯硬僮鞅4嬖谧兞恐械膶?shí)際值。

var a = 10;
var b = a;
b = 20;

上面例子中,var a=10 對a分配知道內(nèi)存地址并賦值10。var b=a 給b分配一個內(nèi)存并將a的值拷貝給b
b只是保存了a復(fù)制的一個副本。所以,b的改變,對a沒有影響。

下面演示內(nèi)存分配時,內(nèi)存的變化。


image.png

引用類型

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

var obj1 = new Object();
var obj2 = obj1;
obj2.name = "我有名字了";
console.log(obj1.name); // 我有名字了

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

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

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

image.png

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

聲明變量時不同的內(nèi)存分配:
  1. 原始值:存儲在棧(stack)中的簡單數(shù)據(jù)段,也就是說,它們的值直接存儲在變量訪問的位置。這是因?yàn)檫@些原始類型占據(jù)的空間是固定的,所以可將他們存儲在較小的內(nèi)存區(qū)域 – 棧中。這樣存儲便于迅速查尋變量的值。

  2. 引用值:存儲在堆(heap)中的對象,也就是說,存儲在變量處的值是一個指針(point),指向存儲對象的內(nèi)存地址。這是因?yàn)椋阂弥档拇笮淖?,所以不能把它放在棧中,否則會降低變量查尋的速度。相反,放在變量的??臻g中的值是該對象存儲在堆中的地址。地址的大小是固定的,所以把它存儲在棧中對變量性能無任何負(fù)面影響。

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

因此它傳遞的值也就是這個內(nèi)存地址,這也就是為什么函數(shù)內(nèi)部對這個參數(shù)的修改會體現(xiàn)在外部的原因了,因?yàn)樗鼈兌贾赶蛲粋€對象。

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

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

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,242評論 8 265
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,658評論 1 32
  • 從三月份找實(shí)習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,803評論 11 349
  • 不知不覺已經(jīng)進(jìn)入12月了,感覺這一年我經(jīng)歷了好多人生大事:報名在職研究生、轉(zhuǎn)行、買房、換工作…可謂收獲頗豐。 20...
    佳期diane閱讀 310評論 2 3
  • 一大早的暴擊:那個很優(yōu)秀的女生,已經(jīng)結(jié)婚了。二月份才認(rèn)識對象,六月份就結(jié)婚了,而且看得出,男方應(yīng)該也是一位家教很好...
    艾米虻虻閱讀 143評論 0 0

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