淺析JavaScript中的特殊數(shù)據(jù)類(lèi)型
在JavaScript中,有6大數(shù)據(jù)類(lèi)型,分別包括string,number,boolean,undefined,null 和 object
一、JS中的特殊類(lèi)型:NaN
NaN 即Not a Number , 不是一個(gè)數(shù)字, 那么NaN到底是什么呢? 而對(duì)于JS來(lái)說(shuō),整數(shù)和浮點(diǎn)數(shù)都統(tǒng)稱(chēng)為number 類(lèi)型,除此之外,number 類(lèi)型還有一個(gè)很特殊的值,即NaN,它是用來(lái)表示是否屬于number 類(lèi)型的一種狀態(tài),而不是一個(gè)確切的值(所以,NaN不等于自身)。
那么,NaN值一般會(huì)在什么情況下出現(xiàn)呢?
一般有兩種情況:
(1) 一個(gè)表達(dá)式中如果有 減號(hào)(-)、乘號(hào)(*) 或 除號(hào)(/) 等運(yùn)算符 時(shí),JS引擎會(huì)在計(jì)算之前試圖將運(yùn)算符兩邊的變量轉(zhuǎn)化為number類(lèi)型(使用Number(x)做轉(zhuǎn)化),如果轉(zhuǎn)化失敗,表達(dá)式將返回NaN;有 加號(hào)(+)運(yùn)算符 不會(huì)將其兩邊的變量轉(zhuǎn)化為number類(lèi)型,這是因?yàn)镴S表達(dá)式的執(zhí)行順序是按照運(yùn)算符的優(yōu)先級(jí)從左到右依次進(jìn)行的,如果加號(hào)(+) 兩邊的變量都是number類(lèi)型時(shí),才會(huì)做數(shù)字相加運(yùn)算,如果其中有一個(gè)變量是字符串,則會(huì)將兩邊都作為字符串相加,如: 5+4+"6"="96"
(2) 直接使用 parseInt,parseFloat 或 Number 將一個(gè)非數(shù)字的值轉(zhuǎn)化為數(shù)字時(shí),表達(dá)式返回 NaN
"abc" - 3 // NaN parseInt( "abc" ) // NaN parseFloat( "abc" ) //NaN Number( "abc" ) //NaN
對(duì)于數(shù)字+字符的值,其轉(zhuǎn)化結(jié)果會(huì)有所不同:
Number( "123abc" ); //NaN parseInt( "123abc" ); //123 parseInt( "123abc45" ); //123 parseFloat( "123.45abc" ); //123.45
這是因?yàn)镹umber轉(zhuǎn)化的整個(gè)值,而不是部分值,parseInt 和 parseFloat 只轉(zhuǎn)化第一個(gè)無(wú)效字符之前的字符串。
因此,當(dāng)一個(gè)字符串不能被Number,parseInt,parseFloat成功轉(zhuǎn)換時(shí),就返回NaN,表示該字符串無(wú)法被識(shí)別為數(shù)字類(lèi)型,這是一個(gè)異常狀態(tài),并不是一個(gè)確切的值。
所以 NaN != NaN , 因?yàn)樗且粋€(gè)異常狀態(tài),而不是一個(gè)確切的值。
另外,與NaN相關(guān)的還有一個(gè)函數(shù),即 isNaN() , 它的作用是檢查一個(gè)字符串是否能被 Number() 成功轉(zhuǎn)換,即強(qiáng)制轉(zhuǎn)化整個(gè)字符串。
isNaN( "123" ) //false 能轉(zhuǎn)換 isNaN( "abc" ) //true 不能轉(zhuǎn)換 isNaN( "123abc" ) //true 部分可轉(zhuǎn)換,但整體不能轉(zhuǎn)換 isNaN( "123.45abc" ) //true 部分可轉(zhuǎn)換,但整體不能轉(zhuǎn)換
二、JS中還有另外兩個(gè)特殊類(lèi)型:undeinfed 和 null
undefined 是JavaScript 6種數(shù)據(jù)類(lèi)型中的一種,該類(lèi)型只有一個(gè)值,也就是undefined。 undefined意為`未定義`,即當(dāng)使用var聲明了變量但未進(jìn)行賦值時(shí),這個(gè)變量的值就是undefined,其產(chǎn)生的原因有兩種:
(1)訪問(wèn)對(duì)象不存在的屬性或方法
(2)聲明了變量但從未賦值
var v1,obj = {}; console.log(v1); //undefined console.log(obj. get ); //undefined typeof v1; // "undefined" typeof v2; // "undefined" typeof obj. get ; // "undefine" typeof obj ; // "object"
和NaN不同的是,undefined雖然也代表變量的一個(gè)狀態(tài),但這個(gè)狀態(tài)值是確定唯一的,即當(dāng)一個(gè)變量聲明了但沒(méi)有賦值時(shí),它的狀態(tài)就是undefined ,因此下面表達(dá)式是成立的:
var b; b == undefined; //true
理解了undefined 以后,再理解null 就容易多了,null類(lèi)型也只有一個(gè)值:null , 表示一個(gè)變量中沒(méi)有包含有效數(shù)據(jù)。null在這里意為空值、空對(duì)象的意思,更確切的說(shuō),一個(gè)被賦值為null的變量沒(méi)有保存有效的數(shù)值、字符串、布爾、數(shù)組或?qū)ο蟮?,可以通過(guò)給一個(gè)變量賦值為null來(lái)清空變量中的內(nèi)容。產(chǎn)生null的原因只有一個(gè):即對(duì)一個(gè)變量顯式的賦值為null 。
var p = null ; console.log(p); //null typeof p ; // "object" typeof null ; // "object"
還是和NaN來(lái)比較,null 也是一個(gè)確定切唯一的狀態(tài)值,當(dāng)一個(gè)變量被賦值為null時(shí),那么它就和null相等,因此下面表達(dá)式也是成立的:
var obj = null ; obj == null ; //true
另外:
var v1 = null; var v2; console.log(v1 + 1 ); // 1 console.log(v2 + 1 ); //NaN var i = i +1; var j = i+ 1; console.log(i); // NaN console.log(j ); //NaN console.log(i == j ); //false
總結(jié)
以上所述是小編給大家介紹的JavaScript中的特殊數(shù)據(jù)類(lèi)型,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
javascript延時(shí)重復(fù)執(zhí)行函數(shù) lLoopRun.js
javascript延時(shí)重復(fù)執(zhí)行函數(shù) lLoopRun.js...2007-06-06(JS實(shí)現(xiàn))MapBar中坐標(biāo)的加密和解密的腳本
(JS實(shí)現(xiàn))MapBar中坐標(biāo)的加密和解密的腳本...2007-05-05JavaScript使用delete刪除數(shù)組元素用法示例【數(shù)組長(zhǎng)度不變】
這篇文章主要介紹了JavaScript使用delete刪除數(shù)組元素用法,結(jié)合實(shí)例形式分析了delete刪除數(shù)組元素的具體用法與注意事項(xiàng),需要的朋友可以參考下2017-01-01javascript實(shí)現(xiàn)window.print()去除頁(yè)眉頁(yè)腳
這篇文章主要介紹了javascript實(shí)現(xiàn)window.print()去除頁(yè)眉頁(yè)腳的方法以及各參數(shù)的設(shè)置技巧,需要的朋友可以參考下2014-12-12如何用js實(shí)現(xiàn)鼠標(biāo)向上滾動(dòng)時(shí)浮動(dòng)導(dǎo)航
今天給大家介紹一下使用JavaScript判斷鼠標(biāo)滑輪是不是向上滾動(dòng),當(dāng)向上滾動(dòng)的時(shí)候,導(dǎo)航條浮動(dòng)在頂部位置。示例代碼如下。2016-07-07JavaScript如何將數(shù)據(jù)處理成樹(shù)形結(jié)構(gòu)
這篇文章主要介紹了JavaScript如何將數(shù)據(jù)處理成樹(shù)形結(jié)構(gòu)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06