在Javascript中检查变量是否包含数值?

在Javascript中检查变量是否包含数值?,javascript,Javascript,在PHP中,这非常简单: is_numeric(23);//true is_numeric("23");//true is_numeric(23.5);//true is_numeric(true);//false 但是如何在Javascript中实现这一点? 我可以使用正则表达式,但有没有函数 function is_numeric(val) { return ((+val) == val); } 这样就可以了。这会检查数值,包括负数和浮点数 function is_numeric(v

在PHP中,这非常简单:

is_numeric(23);//true
is_numeric("23");//true
is_numeric(23.5);//true
is_numeric(true);//false
但是如何在Javascript中实现这一点? 我可以使用正则表达式,但有没有函数

function is_numeric(val) {
  return ((+val) == val);
}

这样就可以了。

这会检查数值,包括负数和浮点数

function is_numeric(val){
    return val && /^-?\d+(\.\d+)?$/.test(val + '');
}

@沃德勒:我修正了正则表达式。它现在应该可以正常工作了。

那么:

function isNumber(n){
    return typeof(n) != "boolean" && !isNaN(n);
}
内置函数用于检查值是否为而不是数字

更新:Christoph是正确的,在JavaScript中,布尔类型可转换为数字,返回1表示真,返回0表示假,因此如果计算
1+true
,结果将为2


考虑到这种行为,我已经更新了函数,以防止将布尔值转换为其数值表示形式。

要检查javascript中的类型,可以使用
typeof
操作符:

js> var x = 1;
js> typeof(x);
number
因此:

如果要将变量的值强制为整数,可以使用
parseInt(x,10)
将值解析为以10为基数的整数。类似地,如果需要浮点值,可以使用
parseFloat
。但是,无论类型如何,这些都将始终强制,因此传递
null
true
等将始终返回一个数字。但是,您可以通过调用
isNaN
来检查该号码是否有效

因此,把所有这些放在一起:

!isNaN(parseFloat(23)) // true
!isNaN(parseFloat('23')) // true
!isNaN(parseFloat(23.5)) // true
!isNaN(parseFloat(true)) // false


我认为到目前为止,这些建议都不起作用。乙二醇

!isNaN(parseFloat(foo))
不会,因为
parseFloat()
忽略尾随的非数字字符

为了解决这个问题,您可以通过
Number()
将返回值与转换返回的值进行比较(或者使用一元
+
进行等效比较,但我更喜欢显式转换):

如果两个函数都返回
NaN
,这仍然有效,因为
NaN!==NaN

另一种可能是先转换为字符串,然后转换为数字,然后检查
NaN
,即

!isNaN(Number(String(foo)))
isFinite(Number(String(foo)))
或等效,但可读性较差(但很可能更快)

如果要排除无穷大值,请使用
isFinite()
而不是
!isNaN()
,即

!isNaN(Number(String(foo)))
isFinite(Number(String(foo)))
通过
Number()
显式转换实际上是不必要的,因为
isNan()
isFinite()
隐式转换为Number-这就是
的原因!isNaN()
不起作用

因此,我认为最合适的解决办法是

isFinite(String(foo))

正如Matthew指出的,第二种方法不能正确处理只包含空格的字符串

这不难修复-使用Matthew评论中的代码或

isFinite(String(foo).trim() || NaN)

您必须决定这是否比比较
parseFloat()
Number()

的结果更好。下面是我的想法:

value = "2.34";
if (parseFloat(value).toString() === value) {
    alert("number");
}
这应该适用于浮点和整数,正数和负数。我不知道无穷大,正如上面的一些答案所讨论的那样


如果您的值实际上可能是一个数字,而不总是一个字符串,那么您可以将===更改为a==并同时处理这两个值。

以下是isNaN与isFinite和typeof==“数字”的一些基准测试


显然,typeof==“number”的速度大约快5倍

运行代码片段,查看关于此主题的顶级答案的比较

有些测试用例没有突出显示(并且没有对摘要做出贡献)。这些情况被标记为不明确,因为不清楚给定值是否应被视为数字

//如果输入为
//数
常数解决方案测试=[
v=>parseFloat(v),
v=>数字(v),
v=>!伊斯南(v),
v=>typeof v!=“boolean”&&&!isNaN(v),
v=>isFinite(字符串(v)),
v=>!isNaN(parseFloat(v))和&isFinite(v)
];
常量测试用例=[
//[测试名称、测试值、预期输出不明确]
//空白
[“,”,假,假],
[“\\t”、“\t”、假、假],
[“,”,假,假],
//无穷大
['无限','无限',假,真],
[“+Infinity”,“Infinity”,假,真],
[“-无限”,-无限,假,真],
[“无限”,无限,假,真],
//混有符号的数字
[‘123abc’、‘123abc’、假、真],
['“abc123”,“abc123”,假,假],
[“.0.”、“.0.”、假、假],
['“1.”,“1.”,真的,真的],
[“,”,假,真],
[‘01’,‘01’,对,对],
[“-0”、“-0”、真、真],
[“+1”,“+1,对,对],
[“-1”,-1,对,对],
//其他js类型
[“'null'”,“null”,false,false],
[“真”,“真”,假,假],
[“假”,“假”,假,假],
[“空”,空,假,假],
[“真”,真,假,假],
[“假”,假,假,假],
[“南”,南,假,假],
[“[”,[],假,假],
[“{},{},假,假],
[“/。/”,/。/,假,假],
[“()=>{}”,()=>{},假,假]
];
常量样式={
代码:{
fontFamily:“单空间”,
字体大小:16
},
成功:{
背景颜色:“00ff5478”
},
失败:{
背景颜色:“ff00008c”
}
};
类TestCaseTable扩展了React.Component{
静态renderTableHeader(solutionsToTest){
返回(
测试用例

{solutionsToTest.map(f=>(

{f.toString()}

))} ); } 静态renderTableRow(testCase、solutionsToTest){ const[testName,input,expectedOutput,isAmbiguous]=testCase; 返回( {testName} {solutionsToTest.map(f=>{ 常量输出=布尔值(f(输入)); const style=isAmbiguous ? {} :output==expectedOutput?styles.success:styles.failure; 返回( {output+“”}

); })} ); } render(){ //对测试用例进行排序,将不明确的放在后面
isFinite(String(foo).trim() || NaN)
value = "2.34";
if (parseFloat(value).toString() === value) {
    alert("number");
}
function isValidNumber(value) {
  return typeof value === 'number' && Number.isNaN(value) === false;
}
isValidNumber(10) // true
isValidNumber(10.34) // true
isValidNumber('geo10') // false
isValidNumber('10geo') // false
isValidNumber('') // false
isValidNumber(NaN) // false
isValidNumber(true) // false
isValidNumber(false) // false