在jQuery中,有几种方式可以判断一个对象是否是数字,或者可否转换为数字。
首先,jQuery.isNaN()在最新版本中已经被移除了(1.7之后),取而代之的是 jQuery.isNumeric ()。这并不奇怪,因为jQuery.isNaN() 同Javascript内置的isNaN()名字相同,但是语义却不完全相同,在一定意义上会造成歧义。 jQuery.isNumeric ()有着与其相似的功能,同时也解决了歧义问题。
jQuery.isNumeric ()检查传进的参数是否是数字或者可否转换为数字;Javascript 内置的isNaN() 检查传进的参数是否是一个合法的数字,典型的例子是0/0。
通过例子说明下$.isNumeric() vs isNaN()的区别:
Demo html:
<table border="1"> <tr> <th>变量</th> <th>!isNaN()</th> <!-- jquery1.7以后不存在该方法 <th>!$.isNaN()</th> --> <th>$.isNumberic()</th> </tr> </table> var values = ["-10",255,"0xFF","8e5",3.1415,10,100,"",{},NaN,null,true,Infinity,undefined,false]; for( var index in values ) { var v = values[ index ]; $( 'table' ).append( '<tr><td>'+v+'</td><td>' +(!isNaN( v )?"true":"false") // +'</td><td>' //+(!$.isNaN( v )?"true":"false") +'</td><td>' +($.isNumeric( v )?"true":"false") +'</td></tr>' ); }
效果图:
变量 | !isNaN() | $.isNumberic() |
---|---|---|
-10 | true | true |
255 | true | true |
0xFF | true | true |
8e5 | true | true |
3.1415 | true | true |
10 | true | true |
100 | true | true |
true | false | |
[object Object] | false | false |
NaN | false | false |
null | true | false |
true | true | false |
Infinity | true | false |
undefined | false | false |
false | true | false |
jQuery $.isNumeric() 同Javascript 自带的!isNaN()在对空字符串、null、true/false、Infinity的处理是不同的。因为isNaN()只是检查传入的值是否是NaN类型。
NaN (Not a Number)是一个数字数据类型,表明未定义(undefined )或无法表示(unrepresentable )的值,尤其是浮点数计算值。
因此,isNaN(null) == false 在语义上是正确的,因为null不是NaN(事实上null、ture/false等等会先转为数字0)。但是如果用!isNaN()来判断传入的值可否转换为数字,又不大恰当。而Javascript另一种方式 typeof num == 'number' 则无法检测字符串情况。因此如果不使用 jQuery $.isNumeric(),则最好还是重写一个方法判断,比如用正则来判断或者:
function isNumeric(obj) { return !isNaN(parseFloat(obj)) && isFinite(obj); }