在一些项目中,我需要验证一些数据并尽可能确定它是可用于数学运算的Javascript数字值。
jQuery和其他一些Javascript库已经包含了这样的函数,通常称为isNumeric。还有一个在stackoverflow上的帖子已经被广泛接受为答案,使用了与前面提到的库相同的一般例程。
作为我的第一篇文章,我无法在那个帖子中回复。我对被接受的帖子有问题的是,似乎存在一些角落情况影响了我正在做的一些工作,所以我进行了一些更改来尝试解决我遇到的问题。
首先,上面的代码如果参数是长度为1的数组,并且该单个元素被视为数字类型,则会返回true。在我看来,如果它是一个数组,那么它就不是数字。
为了解决这个问题,我添加了一个检查来排除逻辑中的数组。
当然,你也可以使用
然后我修改了逻辑来考虑这一点。
如果你担心每次调用函数时都会创建正则表达式,那么你可以在闭包中重新编写它,就像这样。
我随后拿了CMS的+30个测试用例并克隆了在jsfiddle上进行测试,添加了我的额外测试用例和上述解决方案。
一切似乎都按预期工作,我没有遇到任何问题。您能看到任何问题、代码或理论吗?
它可能无法取代被广泛接受/使用的答案,但如果这是您从isNumeric函数中期望的结果,那么希望这会有所帮助。 编辑:正如Bergi指出的那样,还有其他可能被认为是数字的对象,最好是白名单而不是黑名单。考虑到这一点,我会添加以下标准。
我希望我的isNumeric函数只考虑数字或字符串。
考虑到这一点,最好使用
jQuery和其他一些Javascript库已经包含了这样的函数,通常称为isNumeric。还有一个在stackoverflow上的帖子已经被广泛接受为答案,使用了与前面提到的库相同的一般例程。
function isNumber(n) {
return !isNaN(parseFloat(n)) && isFinite(n);
}
作为我的第一篇文章,我无法在那个帖子中回复。我对被接受的帖子有问题的是,似乎存在一些角落情况影响了我正在做的一些工作,所以我进行了一些更改来尝试解决我遇到的问题。
首先,上面的代码如果参数是长度为1的数组,并且该单个元素被视为数字类型,则会返回true。在我看来,如果它是一个数组,那么它就不是数字。
为了解决这个问题,我添加了一个检查来排除逻辑中的数组。
function isNumber(n) {
return Object.prototype.toString.call(n) !== '[object Array]' &&!isNaN(parseFloat(n)) && isFinite(n);
}
当然,你也可以使用
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(/^-/, ''));
}
如果你担心每次调用函数时都会创建正则表达式,那么你可以在闭包中重新编写它,就像这样。
isNumber = (function () {
var rx = /^-/;
return function (n) {
return Object.prototype.toString.call(n) !== '[object Array]' && !isNaN(parseFloat(n)) && isFinite(n.toString().replace(rx, ''));
};
}());
我随后拿了CMS的+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(/^-/, ''));
}
这已作为测试22添加
typeof
来测试数组,因为typeof array
会返回"object"
。 - Felix Kling