JS數(shù)據(jù)類型(基本數(shù)據(jù)類型、引用數(shù)據(jù)類型)及堆和棧的區(qū)別分析
本文實(shí)例講述了JS數(shù)據(jù)類型(基本數(shù)據(jù)類型、引用數(shù)據(jù)類型)及堆和棧的區(qū)別。分享給大家供大家參考,具體如下:
js數(shù)據(jù)類型:基本數(shù)據(jù)類型和引用數(shù)據(jù)類型(文章最下面會(huì)介紹各類型的基礎(chǔ)以及注意事項(xiàng))
基本數(shù)據(jù)類型指的是簡(jiǎn)單的數(shù)據(jù)段,引用數(shù)據(jù)類型指的是有多個(gè)值構(gòu)成的對(duì)象
當(dāng)我們把變量賦值給一個(gè)變量時(shí),解析器首先要確認(rèn)的就是這個(gè)值是基本類型值還是引用類型值
基本數(shù)據(jù)類型:數(shù)字(Number)、字符串(String)、布爾(Boolean)、空(Null)、未定義(Undefined)
引用數(shù)據(jù)類型:也就是對(duì)象類型Object type,比如:Object 、Array 、Function 、Data等
基本數(shù)據(jù)類型
基本數(shù)據(jù)類型是按值訪問(wèn)的,因?yàn)榭梢灾苯硬僮鞅4嬖谧兞恐械膶?shí)際值
var a = 1;var b = a;//b獲取的是a值得一份拷貝,雖然,兩個(gè)變量的值相等,但是兩個(gè)變量保存了兩個(gè)不同的基本數(shù)據(jù)類型值b = 2;console.log(a); // 1
b只是保存了a復(fù)制的一個(gè)副本。所以,b的改變,對(duì)a沒(méi)有影響。
下圖演示了這種基本數(shù)據(jù)類型賦值的過(guò)程:
棧(stack):棧會(huì)自動(dòng)分配內(nèi)存空間,會(huì)自動(dòng)釋放,存放基本類型,簡(jiǎn)單的數(shù)據(jù)段,占據(jù)固定大小的空間。
所有在方法中定義的變量都是放在棧內(nèi)存中,隨著方法的執(zhí)行結(jié)束,這個(gè)方法的內(nèi)存棧也自然銷毀
優(yōu)點(diǎn):存取速度比堆快,僅次于直接位于CPU中的寄存器,數(shù)據(jù)可以共享; 缺點(diǎn):存在棧中的數(shù)據(jù)大小與生存期必須是確定的,缺乏靈活性。
棧:可以遞歸調(diào)用方法,這樣隨著棧深度的增加,JVM維持著一條長(zhǎng)長(zhǎng)的方法調(diào)用軌跡,知道內(nèi)存不夠分配,產(chǎn)生棧溢出。
引用類型數(shù)據(jù)
javascript的引用數(shù)據(jù)類型是保存在堆內(nèi)存中的對(duì)象。
與其他語(yǔ)言的不同是,你不可以直接訪問(wèn)堆內(nèi)存空間中的位置和操作堆內(nèi)存空間。只能操作對(duì)象在棧內(nèi)存中的引用地址。
所以,引用類型數(shù)據(jù)在棧內(nèi)存中保存的實(shí)際上是對(duì)象在堆內(nèi)存中的引用地址。通過(guò)這個(gè)引用地址可以快速查找到保存中堆內(nèi)存中的對(duì)象。
var obj1 = new Object();var obj2 = obj1;obj2.name = '葉落森';console.log(obj1.name); //葉落森
說(shuō)明這兩個(gè)引用數(shù)據(jù)類型指向了同一個(gè)堆內(nèi)存對(duì)象。obj1賦值給onj2,實(shí)際上這個(gè)堆內(nèi)存對(duì)象在棧內(nèi)存的引用地址復(fù)制了一份給了obj2,但是實(shí)際上他們共同指向了同一個(gè)堆內(nèi)存對(duì)象。實(shí)際上改變的是堆內(nèi)存對(duì)象。(這里就會(huì)引出深拷貝和淺拷貝問(wèn)題,這里是淺拷貝,具體的見(jiàn)前面一篇堆和棧的區(qū)別)
下面我們來(lái)演示這個(gè)引用數(shù)據(jù)類型賦值過(guò)程:
各類型的基礎(chǔ)以及注意事項(xiàng)
1.Number類型
Number類型包含整數(shù)和浮點(diǎn)數(shù)(浮點(diǎn)數(shù)數(shù)值必須包含一個(gè)小數(shù)點(diǎn),且小數(shù)點(diǎn)后面至少有一位數(shù)字)兩種值。
NaN:非數(shù)字類型。特點(diǎn):① 涉及到的 任何關(guān)于NaN的操作,都會(huì)返回NaN ② NaN不等于自身。
isNaN() 函數(shù)用于檢查其參數(shù)是否是非數(shù)字值。
isNaN(123) //falseisNaN('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沒(méi)有toString()方法)。
3.Boolean類型
該類型只有兩個(gè)值,true和false
4.Undefined類型
只有一個(gè)值,即undefined值。使用var聲明了變量,但未給變量初始化值,那么這個(gè)變量的值就是undefined。
5.Null類型
null類型被看做空對(duì)象指針,前文說(shuō)到null類型也是空的對(duì)象引用。
6.Object類型
js中對(duì)象是一組屬性與方法的集合。這里就要說(shuō)到引用類型了,引用類型是一種數(shù)據(jù)結(jié)構(gòu),用于將數(shù)據(jù)和功能組織在一起。引用類型有時(shí)候也被稱為對(duì)象定義,因?yàn)樗鼈兠枋龅氖且活悓?duì)象所具有的屬性和方法。
感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章:
1. python爬蟲(chóng)實(shí)戰(zhàn)之制作屬于自己的一個(gè)IP代理模塊2. 基于javaweb+jsp實(shí)現(xiàn)企業(yè)財(cái)務(wù)記賬管理系統(tǒng)3. 詳解盒子端CSS動(dòng)畫(huà)性能提升4. HTML 絕對(duì)路徑與相對(duì)路徑概念詳細(xì)5. css代碼優(yōu)化的12個(gè)技巧6. 使用FormData進(jìn)行Ajax請(qǐng)求上傳文件的實(shí)例代碼7. 如何在jsp界面中插入圖片8. .NET6打包部署到Windows Service的全過(guò)程9. asp批量添加修改刪除操作示例代碼10. 解決ajax請(qǐng)求后臺(tái),有時(shí)收不到返回值的問(wèn)題
