JavaScript基礎(chǔ)06—Nubmer類型(下)

NaN

NaN是Not a Number的縮寫菩鲜,意即不是一個(gè)數(shù)字,但是仍然是Number類型胳螟。
在JS中求值運(yùn)算昔馋、類型轉(zhuǎn)換等情況下如果遇到無法執(zhí)行的代碼,就會(huì)拋出NaN糖耸,例如

console.log(0 / 0); // NaN

NaN的特點(diǎn):

  • 任何與NaN有關(guān)的運(yùn)算都會(huì)返回NaN
  • NaN和任何值都不相等秘遏,包括NaN,即
    console.log(NaN === NaN); // false
    

isNaN()和Number.isNaN()

JavaScript提供了isNaN()全局函數(shù)來檢測NaN嘉竟,該函數(shù)會(huì)對傳入的非數(shù)值參數(shù)嘗試進(jìn)行數(shù)值轉(zhuǎn)換邦危,如果可以成功轉(zhuǎn)換則返回false,否則返回true舍扰。

console.log(isNaN(124)); // false
console.log(isNaN(false)); // false
console.log(isNaN('345')); // false
console.log(isNaN('hello')); // true
console.log(isNaN({})); // true
console.log(isNaN([])); // false
console.log(isNaN(NaN)); // true

而ES6更新的Number.isNaN()則更穩(wěn)妥:該方法不會(huì)隱式轉(zhuǎn)換參數(shù)倦蚪,只有當(dāng)傳入的表達(dá)式或變量為NaN時(shí)才會(huì)返回true。

console.log(Number.isNaN(124)); // false
console.log(Number.isNaN(false)); // false
console.log(Number.isNaN('345')); // false
console.log(Number.isNaN('hello')); // false
console.log(Number.isNaN({})); // false
console.log(Number.isNaN([])); // false
console.log(Number.isNaN(NaN)); // true

使用isNaN還是Number.isNaN取決于你的開發(fā)環(huán)境边苹,在不兼容ES6的環(huán)境下也可以使用以下模擬Number.isNaN的polyfill:

Number.isNaN = Number.isNaN || function(val){
        return  typeof val === "number" && isNaN(val); 
}

轉(zhuǎn)換為數(shù)值的4種方式

JavaScript提供了4種將其他類型轉(zhuǎn)換為數(shù)值的方法陵且,分別是:

  • Number()
  • parseInt()
  • parseFloat()
  • +號(hào)操作符

Number()轉(zhuǎn)型函數(shù)

Number()轉(zhuǎn)型函數(shù)可以將JavaScript中的任意數(shù)據(jù)類型轉(zhuǎn)換為數(shù)值類型。

  • 數(shù)值類型原樣返回
  • 布爾類型true會(huì)轉(zhuǎn)換為1个束,false會(huì)轉(zhuǎn)換為0
  • null會(huì)轉(zhuǎn)換為0
  • undefined會(huì)轉(zhuǎn)換為NaN
  • 對象會(huì)首先調(diào)用valueOf()方法慕购,如果返回的結(jié)果仍是對象,則再調(diào)用toString()方法茬底。
  • 字符串的情況最為特殊沪悲,我們詳細(xì)總結(jié)下:
    • 如果字符串為空,則會(huì)轉(zhuǎn)換為0阱表;
    • 如果字符串只包含有效整數(shù)或浮點(diǎn)數(shù)殿如,則會(huì)轉(zhuǎn)化為對應(yīng)的數(shù)值類型昌妹,但是會(huì)忽略前置0
    • 如果字符串包含有效的二進(jìn)制、八進(jìn)制或十六進(jìn)制格式握截,則會(huì)轉(zhuǎn)換為與之對應(yīng)的十進(jìn)制整數(shù)
    • 如果字符串中還有上述情況之外的其他字符飞崖,則會(huì)返回NaN

來看幾個(gè)例子:

console.log(Number(124));  // 124
console.log(Number(false));  // 0
console.log(Number('345'));  // 345
console.log(Number("")); // 0
console.log(Number('hello')); // NaN
console.log(Number({})); // NaN
console.log(Number([]));  // 0 
console.log(Number("0b101")); // 5

+號(hào)操作符的轉(zhuǎn)換規(guī)則和Number()一樣,因此不再贅述谨胞。
Number()適用于任何數(shù)據(jù)類型固歪,但是在轉(zhuǎn)換字符串時(shí)稍顯不足,因此JavaScript提供了專門用于轉(zhuǎn)換字符串的函數(shù):parseInt()和parseFloat()胯努,前者主要用于轉(zhuǎn)換成整數(shù)牢裳,后者主要用于轉(zhuǎn)換成浮點(diǎn)數(shù)。

parseInt()

parseInt()函數(shù)用于解析一個(gè)字符串叶沛,并返回指定基數(shù)對應(yīng)的整數(shù)值蒲讯。其語法格式如下:

parseInt(string, radix);

string 表示要被解析的值,如果該參數(shù)不是一個(gè)字符串灰署,則會(huì)調(diào)用toString()方法轉(zhuǎn)換為字符串判帮,而字符串會(huì)忽略前面的空白符

radix 表示的是進(jìn)制轉(zhuǎn)換的基數(shù),數(shù)值范圍在2-36之間溉箕,當(dāng)不傳遞該參數(shù)時(shí)可能會(huì)出現(xiàn)意向不到的結(jié)果晦墙,因此建議始終傳入第二個(gè)表示基數(shù)的參數(shù)。

返回值

整數(shù)或NaN

parseInt()函數(shù)將字符串轉(zhuǎn)換為整數(shù)需要注意以下幾點(diǎn):

  1. 非字符串類型轉(zhuǎn)換為字符串
    盡管parseInt()是用于轉(zhuǎn)換字符串的肴茄,但是依然可以傳入非字符串類型晌畅。當(dāng)傳入的值類型不是字符串時(shí)會(huì)先調(diào)用toString()方法或String()函數(shù)轉(zhuǎn)換為字符串后再進(jìn)行轉(zhuǎn)換
console.log(parseInt(0x16, 16));  // 34
console.log(parseInt('0x16', 16));  //22

上面的例子中當(dāng)我們傳入0x16時(shí),因?yàn)?x16是Number類型寡痰,因此會(huì)先調(diào)用toString()方法轉(zhuǎn)換為"22",而十六進(jìn)制的"22"轉(zhuǎn)換成十進(jìn)制后會(huì)變成34抗楔。
因此要特別注意傳入非字符串時(shí)的轉(zhuǎn)換規(guī)則。

  1. 有效的浮點(diǎn)數(shù)值格式
    parseInt()主要用來轉(zhuǎn)換為整數(shù)拦坠,因此該函數(shù)不能識(shí)別字符串中的表示浮點(diǎn)數(shù)的e或.(小數(shù)點(diǎn))
console.log(parseInt('2e4'));  // 2
console.log(parseInt(5e3)); //  5000
console.log(parseInt('12.7')); // 12
  1. 空字符串
    parseInt()轉(zhuǎn)換時(shí)主要看字符串中的有效數(shù)字连躏,同時(shí)會(huì)忽略開頭的空白字符,因此空字符串中沒有有效數(shù)字字符贪婉,會(huì)返回NaN
console.log(parseInt('')); // NaN

4.普通字符串
對于普通字符串反粥,會(huì)從第一位開始尋找有效數(shù)值(也可以識(shí)別開頭的+和-號(hào)),直至遇到非有效數(shù)值時(shí)停止疲迂,截取前面的有效數(shù)字轉(zhuǎn)為數(shù)字。

console.log(parseInt('32blue')); // 32
console.log(parseInt('  -70.1')); // -70 
console.log(parseInt('01010')); // 1010,會(huì)忽略前面的零

5.可以設(shè)置進(jìn)制轉(zhuǎn)換的基數(shù)
如果明確要轉(zhuǎn)換的字符串是有效的二進(jìn)制莫湘、八進(jìn)制或十六進(jìn)制尤蒿,那么可以省略其前綴并設(shè)置對應(yīng)的基數(shù),parseInt會(huì)將其轉(zhuǎn)換為對應(yīng)的十進(jìn)制形式幅垮。

console.log(parseInt('1010', 2)); // 10
console.log(parseInt('1010', 8)); // 520
console.log(parseInt('1010', 10)); // 1010
console.log(parseInt('1010', 16)); // 4112

parseFloat()

parseFloat()主要用來將字符串盡可能轉(zhuǎn)換為浮點(diǎn)數(shù)腰池。
parseFloat()沒有第二個(gè)可選的基數(shù)參數(shù),因此相對規(guī)則簡單點(diǎn)。
parseFloat()也是從字符串的第一位開始尋找有效的浮點(diǎn)數(shù)值字符(包括第一個(gè)e以及第一個(gè).(小數(shù)點(diǎn))),直至遇到非有效數(shù)值時(shí)停止示弓,并截取有效字符返回對應(yīng)的浮點(diǎn)數(shù)格式讳侨。

console.log(parseFloat("2e2"));
console.log(parseFloat("12.7.1"));
console.log(parseFloat("12blue"));
console.log(parseFloat("false"));

注意:parseFloat()不認(rèn)識(shí)其他進(jìn)制的前綴,會(huì)始終認(rèn)為其是十進(jìn)制格式奏属,因此如果傳入的值為其他進(jìn)制的字符串形式跨跨,則會(huì)返回0

console.log(parseFloat("0b101")); // 0
console.log(parseFloat("0o101")); // 0
console.log(parseFloat("0x101")); // 0
console.log(parseFloat("101"));  // 101 

Number.parseInt()和Number.parseFloat()

ES6將轉(zhuǎn)換字符串的這兩個(gè)全局函數(shù)掛載到Number對象上作為Number的靜態(tài)方法來使用,其效果等同于ES5下的全局方法囱皿。

console.log(Number.parseInt === parseInt); // true
console.log(Number.parseFloat === parseFloat); // true 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勇婴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子嘱腥,更是在濱河造成了極大的恐慌耕渴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件齿兔,死亡現(xiàn)場離奇詭異橱脸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來移迫,“玉大人叫胁,你說我怎么就攤上這事”∷” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長艾帐。 經(jīng)常有香客問我,道長盆偿,這世上最難降的妖魔是什么柒爸? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮事扭,結(jié)果婚禮上捎稚,老公的妹妹穿的比我還像新娘。我一直安慰自己求橄,他們只是感情好今野,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罐农,像睡著了一般条霜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涵亏,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天宰睡,我揣著相機(jī)與錄音蒲凶,去河邊找鬼。 笑死拆内,一個(gè)胖子當(dāng)著我的面吹牛旋圆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播麸恍,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼灵巧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了或南?” 一聲冷哼從身側(cè)響起孩等,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎采够,沒想到半個(gè)月后肄方,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹬癌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年权她,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逝薪。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡隅要,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出董济,到底是詐尸還是另有隱情步清,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布虏肾,位于F島的核電站廓啊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏封豪。R本人自食惡果不足惜谴轮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吹埠。 院中可真熱鬧第步,春花似錦、人聲如沸缘琅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胯杭。三九已至驯杜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間做个,已是汗流浹背鸽心。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留居暖,地道東北人顽频。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像太闺,于是被迫代替她去往敵國和親糯景。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容