underscore中_.isNumber()
會判斷一個值是否為number
類型,在業(yè)務(wù)中,我們常常使用其做數(shù)值類型的校驗,但是很詭異的一點是
_.isNumber(NaN) ; // return true
對此,Michael Ficarra的解釋是,NaN
是一種浮點類型。
You're right, it is on purpose. And I don't think it needs to be explicitly stated. Anyone that's ever worked with IEEE 754 floats before probably knows that NaN is just another floating point value.
然后,我們看下IEEE 754標準
IEEE二進制浮點數(shù)算術(shù)標準(IEEE 754)是20世紀80年代以來最廣泛使用的浮點數(shù)運算標準,為許多CPU與浮點運算器所采用。這個標準定義了表示浮點數(shù)的格式(包括負零-0)與反常值(denormal number)),一些特殊數(shù)值(無窮(Inf)與非數(shù)值(NaN)),以及這些數(shù)值的“浮點數(shù)運算符”;它也指明了四種數(shù)值舍入規(guī)則和五種例外狀況(包括例外發(fā)生的時機與處理方式)。
在JS中使用浮點數(shù)的格式表示的值應(yīng)該都算為number
類型。因此,在underscore中_.isNumber()
函數(shù)對NaN
以及Infinity
都會返回true
。
我們在業(yè)務(wù)中寫判斷數(shù)字類型可能要這樣寫了:
_.isNumber(someValue) && !_.isNaN(someValue) && !isFinite(someValue)