_.isNumber(NaN) returns true

underscore中_.isNumber()会判断一个值是否为number类型,在业务中,我们常常使用其做数值类型的校验,但是很诡异的一点是

_.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二进制浮点数算术标准IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。

在JS中使用浮点数的格式表示的值应该都算为number类型。因此,在underscore中_.isNumber()函数对NaN以及Infinity都会返回true

我们在业务中写判断数字类型可能要这样写了:

_.isNumber(someValue) && !_.isNaN(someValue) && !isFinite(someValue)

你可能感兴趣的:(_.isNumber(NaN) returns true)