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):
- 非字符串類型轉(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ī)則。
- 有效的浮點(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
- 空字符串
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