|
|
|
|
|
說實在的,在知道這個事實之前,我一直用的是isNaN
來判斷是否數(shù)字的,我想很多人都在用它,因為它簡單易用。在知道這個事實之后,我在想,我的應(yīng)用出現(xiàn)了多少誤判事件!
isNaN的含義及用法
isNaN()
是“不是數(shù)字”的意思, NaN=Not a Number 。而isNaN
的用法也十分簡單,若isNaN(b)
為true
,則說明b不是數(shù)字。
isNaN的誤判示例
遺憾的是,isNaN
會出現(xiàn)誤判的情況,比如下面的幾個示例:
isNaN(true); //false 誤判
isNaN(""); //false 誤判
isNaN(" "); //false 誤判
isNaN(null); //false 誤判
isNaN為什么會誤判
當(dāng) isNaN
函數(shù)的參數(shù)不是Number
類型時,該值首先被強(qiáng)制轉(zhuǎn)換為 Number
。然后測試結(jié)果值以確定它是否NaN
,因此,對于非數(shù)字,當(dāng)強(qiáng)制轉(zhuǎn)換為數(shù)字類型時會產(chǎn)生一個有效的非 NaN
數(shù)值(特別是空字符串和布爾基元,當(dāng)強(qiáng)制轉(zhuǎn)換為數(shù)字值 0 或 1)時,“false
”返回值可能是意料之外的;例如,空字符串肯定是“不是數(shù)字”,但isNaN("")
返回是false
。
其他判斷是否數(shù)字的方法
既然isNaN
不完美,那么我們就找其他的方法吧。除了isNaN
,我們還可以用其他方法來判斷是否數(shù)字。這里介紹兩種方法。
typeof
操作符返回一個字符串,表示未經(jīng)計算的操作數(shù)的類型。
num = 45
strng = '34'
typeof num // 返回 'number'
typeof strng // 返回 "string"
typeof undefined // 返回 "undefined"
typeof null // 返回 "object"
如果變量是 number
類型,它將返回 'number
'字符串,我們可以使用它來確定變量是否為數(shù)字類型。
var numberOfpushUpsToday = 34;
if(typeof numberOfpushUpsToday === 'number' ){
console.log('它是一個數(shù)字')
}
else {
console.log('它不是一個數(shù)字')
}
typeof()
的表現(xiàn)要比isNaN()
好得多,它正確地確定字符串變量null
和布爾值(true
和false
)不是數(shù)字。
函數(shù)isFinite()
確定傳遞的值是否是有限的,參數(shù)首先轉(zhuǎn)換為數(shù)字,然后檢查值是否有限。此方法適用于 undefined
和 Boolean
,因此這是上述所有方法中最好的方法。
Number.isFinite(34) // 返回 true
Number.isFinite('Hello') // 返回 false
Number.isFinite(undefined) // 返回 false
Number.isFinite(true) // 返回 false
Number.isFinite(null) // 返回 false
var numberOfpushUpsToday = 34;
if(Number.isFinite(numberOfpushUpsToday) ){
console.log('它是一個數(shù)字')
}
else {
console.log('它不是一個數(shù)字')
}
總結(jié)
本文介紹了isNaN
判斷是否數(shù)字的缺陷,另外介紹了兩種判斷是否數(shù)字的方法,推薦使用Number.isFinite()
。