我的代码是:
function isNumber(n){ return typeof n == 'number' && !isNaN(n); } window.onload=function(){ var a=0,b=1,c=2.2,d=-3,e=-4.4,f=10/3; var shouldBeTrue=[a,b,c,d,e,f]; var aa="0",bb="1",cc="2.2",dd="-3",ee="-4.4",ff="10/3"; var shouldBeFalse=[aa,bb,cc,dd,ee,ff]; var aaa,bbb=true,ccc=false,ddd=document.getElementsByTagName('html'); var alsoTheseBeFalse=[aaa,bbb,ccc,ddd,""," ",null,NaN]; for(var i=0;i<shouldBeTrue.length;i++) if(isNumber(shouldBeTrue[i]) != true) alert("x"); for(i=0;i<shouldBeFalse.length;i++) if(isNumber(shouldBeFalse[i]) != false) alert("x"); for(i=0;i<alsoTheseBeFalse.length;i++) if(isNumber(alsoTheseBeFalse[i]) != false) alert("x"); }
解决方法
如果你想检查一个数字是否是一个实数,你还应该检查它是否有限:
function isNumber(n){ return typeof n == 'number' && !isNaN(n) && isFinite(n); }
另一种方法(下面的解释):
function isNumber(n){ return typeof n == 'number' && !isNaN(n - n); }
更新:验证一个实数的两个表达式
由于JavaScript编号代表实数,相同编号上的减法运算数应该产生零值(additive identity).超出范围的数字应该(并且将)无效NaN.
1 - 1 = 0 // OK Infinity - Infinity = NaN // Expected NaN - NaN = NaN // Expected NaN - Infinity = NaN