一个改进的isNumeric()函数?

Xot*_*750 39 javascript validation numbers isnumeric

在某些项目中,我需要验证一些数据并尽可能确定它是可以在数学运算中使用的javascript数值.

jQuery和其他一些javascript库已经包含了这样一个函数,通常称为isNumeric.stackoverflow上还有一篇文章被广泛接受为答案,与前面提到的库所使用的一般例程相同.

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}
Run Code Online (Sandbox Code Playgroud)

作为我的第一篇文章,我无法在该帖子中回复.我接受的帖子的问题是,似乎有一些角落案例影响了我正在做的一些工作,所以我做了一些改变,试图解决我遇到的问题.

首先,如果参数是长度为1的数组,则上面的代码将返回true,并且该单个元素是上述逻辑认为是数字的类型.在我看来,如果它是一个数组,那么它不是数字.

为了缓解这个问题,我添加了一个检查来从逻辑中对数组进行折扣

function isNumber(n) {
  return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n);
}
Run Code Online (Sandbox Code Playgroud)

当然,您也可以使用Array.isArray而不是Object.prototype.toString.call(n) !== '[object Array]'

编辑:我已经更改了代码以反映数组的通用测试,或者您可以使用jquery $.isArray或原型Object.isArray

我的第二个问题是负十六进制整数文字字符串("-0xA" - > -10)没有被计为数字.但是,正十六进制整数文字字符串("0xA" - > 10)被视为数字.我需要两个都是有效的数字.

然后我修改了逻辑以考虑到这一点.

function isNumber(n) {
  return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}
Run Code Online (Sandbox Code Playgroud)

如果你每次调用函数时都担心正则表达式的创建,那么你可以在一个闭包中重写它,就像这样

isNumber = (function () {
  var rx = /^-/;

  return function (n) {
      return Object.prototype.toString.call(n) !== '[object Array]' && !isNaN(parseFloat(n)) && isFinite(n.toString().replace(rx, ''));
  };
}());
Run Code Online (Sandbox Code Playgroud)

然后,我接受了CMSs +30测试用例,在jsfiddle上克隆了测试,添加了我的额外测试用例和我上面提到的解决方案.

一切似乎都按预期工作,我没有遇到任何问题.您可以看到任何问题,代码或理论吗?

它可能无法取代广泛接受/使用的答案,但如果这是您希望的isNumeric函数的结果,那么希望这会有所帮助.

编辑:正如Bergi所指出的,还有其他可能被视为数字的对象,白名单比黑名单更好.考虑到这一点,我会添加标准.

我希望我的isNumeric函数只考虑数字或字符串

考虑到这一点,最好使用它

function isNumber(n) {
  return (Object.prototype.toString.call(n) === '[object Number]' || Object.prototype.toString.call(n) === '[object String]') &&!isNaN(parseFloat(n)) && isFinite(n.toString().replace(/^-/, ''));
}
Run Code Online (Sandbox Code Playgroud)

这已被添加为测试22

Tut*_*men 0

function isNumber(value){return typeof value == 'number';}
Run Code Online (Sandbox Code Playgroud)