JS數(shù)據(jù)類型(基本數(shù)據(jù)類型、引用數(shù)據(jù)類型)及堆和棧的區(qū)別分析
本文實例講述了JS數(shù)據(jù)類型(基本數(shù)據(jù)類型、引用數(shù)據(jù)類型)及堆和棧的區(qū)別。分享給大家供大家參考,具體如下:
js數(shù)據(jù)類型:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型(文章最下面會介紹各類型的基礎(chǔ)以及注意事項)
基本數(shù)據(jù)類型指的是簡單的數(shù)據(jù)段,引用數(shù)據(jù)類型指的是有多個值構(gòu)成的對象
當(dāng)我們把變量賦值給一個變量時,解析器首先要確認(rèn)的就是這個值是基本類型值還是引用類型值
基本數(shù)據(jù)類型:數(shù)字(Number)、字符串(String)、布爾(Boolean)、空(Null)、未定義(Undefined)
引用數(shù)據(jù)類型:也就是對象類型Object type,比如:Object 、Array 、Function 、Data等
基本數(shù)據(jù)類型
基本數(shù)據(jù)類型是按值訪問的,因為可以直接操作保存在變量中的實際值
var a = 1; var b = a;//b獲取的是a值得一份拷貝,雖然,兩個變量的值相等,但是兩個變量保存了兩個不同的基本數(shù)據(jù)類型值 b = 2; console.log(a); // 1
b只是保存了a復(fù)制的一個副本。所以,b的改變,對a沒有影響。
下圖演示了這種基本數(shù)據(jù)類型賦值的過程:
棧(stack):棧會自動分配內(nèi)存空間,會自動釋放,存放基本類型,簡單的數(shù)據(jù)段,占據(jù)固定大小的空間。
所有在方法中定義的變量都是放在棧內(nèi)存中,隨著方法的執(zhí)行結(jié)束,這個方法的內(nèi)存棧也自然銷毀
優(yōu)點:存取速度比堆快,僅次于直接位于CPU中的寄存器,數(shù)據(jù)可以共享;
缺點:存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。
棧:可以遞歸調(diào)用方法,這樣隨著棧深度的增加,JVM維持著一條長長的方法調(diào)用軌跡,知道內(nèi)存不夠分配,產(chǎn)生棧溢出。
引用類型數(shù)據(jù)
javascript的引用數(shù)據(jù)類型是保存在堆內(nèi)存中的對象。
與其他語言的不同是,你不可以直接訪問堆內(nèi)存空間中的位置和操作堆內(nèi)存空間。只能操作對象在棧內(nèi)存中的引用地址。
所以,引用類型數(shù)據(jù)在棧內(nèi)存中保存的實際上是對象在堆內(nèi)存中的引用地址。通過這個引用地址可以快速查找到保存中堆內(nèi)存中的對象?! ?/p>
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)存對象。(這里就會引出深拷貝和淺拷貝問題,這里是淺拷貝,具體的見前面一篇堆和棧的區(qū)別)
下面我們來演示這個引用數(shù)據(jù)類型賦值過程:
各類型的基礎(chǔ)以及注意事項
1.Number類型
Number類型包含整數(shù)和浮點數(shù)(浮點數(shù)數(shù)值必須包含一個小數(shù)點,且小數(shù)點后面至少有一位數(shù)字)兩種值。
NaN:非數(shù)字類型。特點:① 涉及到的 任何關(guān)于NaN的操作,都會返回NaN ② NaN不等于自身。
isNaN() 函數(shù)用于檢查其參數(shù)是否是非數(shù)字值。
isNaN(123) //false isNaN("hello") //true
2.String類型
字符串有l(wèi)ength屬性。
字符串轉(zhuǎn)換:轉(zhuǎn)型函數(shù)String(),適用于任何數(shù)據(jù)類型(null,undefined 轉(zhuǎn)換后為null和undefined);toString()方法(null,defined沒有toString()方法)。
3.Boolean類型
該類型只有兩個值,true和false
4.Undefined類型
只有一個值,即undefined值。使用var聲明了變量,但未給變量初始化值,那么這個變量的值就是undefined。
5.Null類型
null類型被看做空對象指針,前文說到null類型也是空的對象引用。
6.Object類型
js中對象是一組屬性與方法的集合。這里就要說到引用類型了,引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起。引用類型有時候也被稱為對象定義,因為它們描述的是一類對象所具有的屬性和方法。
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)學(xué)運算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯誤與調(diào)試技巧總結(jié)》
希望本文所述對大家JavaScript程序設(shè)計有所幫助。
相關(guān)文章
微信小程序?qū)崿F(xiàn)傳參數(shù)的幾種方法示例
這篇文章主要給大家介紹了關(guān)于微信小程序?qū)崿F(xiàn)傳參數(shù)的幾種方法,分別是navigator跳轉(zhuǎn)時、全局變量、列表index下標(biāo)取值以及form表單傳值的相關(guān)內(nèi)容,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01mpvue 頁面預(yù)加載新增preLoad生命周期的兩種方式
這篇文章主要介紹了mpvue 頁面預(yù)加載新增preLoad生命周期的兩種方式,本文重點給大家講解了第一種方式,需要的朋友可以參考下2019-10-10你必須知道的Javascript知識點之"單線程事件驅(qū)動"的使用
本篇文章小編為大家介紹,你必須知道的Javascript知識點之"單線程事件驅(qū)動"的使用。需要的朋友參考下2013-04-04