在PHP中,它非常简单:
is_numeric(23);//true is_numeric("23");//true is_numeric(23.5);//true is_numeric(true);//false
但是我如何在Javascript中执行此操作?我可以使用正则表达式,但是有一个函数吗?
关于什么:
function isNumber(n){ return typeof(n) != "boolean" && !isNaN(n); }
该isNaN内置函数用来检查一个值不是一个数字.
更新: Christoph是正确的,在JavaScript中布尔类型可以转换为Number,返回1表示true,0表示false表示错误,因此如果评估1 + true
结果将为2.
考虑到这种行为,我更新了函数以防止将布尔值转换为其数字表示.
我认为到目前为止的任何建议都没有实际发挥作用.例如
!isNaN(parseFloat(foo))
不会因为parseFloat()
忽略尾随的非数字字符.
要解决此问题,您可以将返回值与强制转换返回的值进行比较Number()
(或者等效地使用一元+
,但我更喜欢显式转换):
parseFloat(foo) === Number(foo)
如果这两个函数返回这将仍然有效NaN
,因为NaN !== NaN
是true
.
另一种可能性是首先转换为字符串,然后编号然后检查NaN
,即
!isNaN(Number(String(foo)))
或等效,但不太可读(但最有可能更快)
!isNaN(+('' + foo))
如果要排除无穷大值,请使用isFinite()
而不是!isNaN()
,即
isFinite(Number(String(foo)))
显式转换通道Number()
实际上是不必要的,因为isNan()
并且isFinite()
隐式地转换为数字 - 这就是为什么!isNaN()
不起作用的原因!
在我看来,最合适的解决方案是
isFinite(String(foo))
正如Matthew指出的那样,第二种方法不处理只包含正确空格的字符串.
修复起来并不难 - 使用Matthew评论中的代码或
isFinite(String(foo).trim() || NaN)
你必须决定,如果这仍然不是比较的结果更好的parseFloat()
和Number()
.
要检查javascript中的类型,您可以使用typeof
运算符:
js> var x = 1; js> typeof(x); number
所以:
if (typeof(x) === 'number') { // Do something }
如果要将变量的值强制转换为整数,可以使用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
要么
function isNumber(x) { return !isNaN(parseFloat(x)); }