[英]How to check if a JavaScript number is a real, valid number?
我的代码是:
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");
}
我还应该检查什么以确保我的功能在所有方面都 101% 完美? (另外,如果您知道更好的功能,请告诉我)
如果你想检查一个数是否是实数,你还应该检查它是否有穷:
function isNumber(n){
return typeof n == 'number' && !isNaN(n) && isFinite(n);
}
另一种方法(解释如下):
function isNumber(n){
return typeof n == 'number' && !isNaN(n - n);
}
由于 JavaScript 数字代表实数,因此相同数字的减法操作数应产生零值(加法标识) 。 超出范围的数字应该(并且将)无效, NaN
。
1 - 1 = 0 // OK
Infinity - Infinity = NaN // Expected
NaN - NaN = NaN // Expected
NaN - Infinity = NaN
JS 编号可以是以下值:
+Infinity
和-Infinity
NaN
然后还有可强制转换为数字的非数字值,例如数字对象。 您可能希望将它们视为数字。
如果您只想测试有限数,只需使用Number.isFinite
:
Number.isFinite(value)
var isNumber = Number.isFinite; assert('isNumber(1)', true); assert('isNumber(1.1)', true); assert('isNumber(+0)', true); assert('isNumber(-0)', true); assert('isNumber(-1.1)', true); assert('isNumber(Math.PI)', true); assert('isNumber(1e300)', true); assert('isNumber(+Infinity)', false); assert('isNumber(-Infinity)', false); assert('isNumber(NaN)', false); assert('isNumber(null)', false); assert('isNumber(undefined)', false); assert('isNumber(true)', false); assert('isNumber(false)', false); assert('isNumber("123")', false); assert('isNumber("foo")', false); assert('isNumber(new Number(1))', false); assert('isNumber([])', false); assert('isNumber({})', false); assert('isNumber(function(){})', false); function assert(code, expected) { var result = eval(code); console.log('Test ' + (result===expected ? 'pass' : 'FAIL') + ': ', code, ' -> ', result); }
如果要包含无穷大,请检查类型并排除NaN
:
typeof value === "number" && !Number.isNaN(value)
function isNumber(value) { return typeof value === "number" && !Number.isNaN(value); } assert('isNumber(1)', true); assert('isNumber(1.1)', true); assert('isNumber(+0)', true); assert('isNumber(-0)', true); assert('isNumber(-1.1)', true); assert('isNumber(Math.PI)', true); assert('isNumber(1e300)', true); assert('isNumber(+Infinity)', true); assert('isNumber(-Infinity)', true); assert('isNumber(NaN)', false); assert('isNumber(null)', false); assert('isNumber(undefined)', false); assert('isNumber(true)', false); assert('isNumber(false)', false); assert('isNumber("123")', false); assert('isNumber("foo")', false); assert('isNumber(new Number(1))', false); assert('isNumber([])', false); assert('isNumber({})', false); assert('isNumber(function(){})', false); function assert(code, expected) { var result = eval(code); console.log('Test ' + (result===expected ? 'pass' : 'FAIL') + ': ', code, ' -> ', result); }
如果您想将数字对象视为数字,您可以使用
value = Number.valueOf.call(value); // throws if value was not a number object
function isNumber(value) { try { value = Number.prototype.valueOf.call(value); } catch(err) { } return Number.isFinite(value); } assert('isNumber(1)', true); assert('isNumber(1.1)', true); assert('isNumber(+0)', true); assert('isNumber(-0)', true); assert('isNumber(-1.1)', true); assert('isNumber(Math.PI)', true); assert('isNumber(1e300)', true); assert('isNumber(+Infinity)', false); assert('isNumber(-Infinity)', false); assert('isNumber(NaN)', false); assert('isNumber(null)', false); assert('isNumber(undefined)', false); assert('isNumber(true)', false); assert('isNumber(false)', false); assert('isNumber("123")', false); assert('isNumber("foo")', false); assert('isNumber(new Number(1))', true); assert('isNumber([])', false); assert('isNumber({})', false); assert('isNumber(function(){})', false); function assert(code, expected) { var result = eval(code); console.log('Test ' + (result===expected ? 'pass' : 'FAIL') + ': ', code, ' -> ', result); }
如果要包含可强制转换为数字的任意值,可以使用一元+
进行强制。
value = +value; // throws if value was not number-coercible
还有isNaN
函数(不要与Number.isNaN
混淆),它会首先强制转换,然后与NaN
进行比较。 但请注意空白字符串和null
被强制为+0
,而不是NaN
。 所以你可能对在 JavaScript中验证十进制数感兴趣- IsNumeric()
我使用解析和检查数字的组合.. 如下所述
function isNumber(inputValue){ return ((parseFloat(inputValue) ==0 || parseFloat(inputValue)) && !isNaN(inputValue)); };
希望这可以帮助
对于 react 或其他框架用户,可能的解决方案可能是:
const { onChange, value } = this.props;
return (
<input
type="text" // Note: I have kept this as text
value={typeof value !== 'number' || isNaN(value) ? '' : value}
className={classnames('input')}
onChange={(event) =>
onChange &&
onChange(parseFloat(event.target.value))
}
/>)
这也适用于 safari。
谢谢。
这取决于您希望将什么视为数字。 您的代码将 Infinity 和 -Infinity 分类为数字。 如果您不希望那样,请将 !isNaN(n) 替换为 isFinite(n)。
由于类型检查,您的代码将“42”(字符串文字)分类为不是数字; 但我想那是故意的。
如果您将其对象包装器中的数字视为数字,则它将失败并显示:
isNumber( new Number(123) )
由于downvoter 有一些无法通过简单测试缓解的理解问题, new Number(123)
将从typeof
测试中返回'object'
,因此不会通过。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.