我在线阅读教程说明: 实际上,最可靠的转换检查是regexp或isNumeric:
function isNumeric(n) {
return !isNaN(parseFloat(n)) && isFinite(n)
}
我的问题是为什么这个功能不能简化为:
function isNumeric(n) {
return isFinite(n)
}
答案 0 :(得分:2)
因为isFinite(n)将对非数字值返回true,例如:
alert(isFinite(false)); // displays true
答案 1 :(得分:2)
我的问题是为什么这个功能不能简化为:
function isNumeric(n) { return isFinite(n) }
如果有任何机会parseFloat
可能不是一个开头的数字,那么你不能,不,你想要n
。但它可以简化为:
function isNumeric(n) {
return isFinite(parseFloat(n));
}
...因为isFinite(NaN)
是假的,无论如何,这是你的函数为不可解析的数字返回的。
值得注意的是,parseFloat
将停留在第一个无效字符并返回它找到的任何数字,因此parseFloat("123abc")
为123
,而不是NaN
。如果要验证整个字符串是否可以正确解析为浮点,请使用+
或Number()
:
function isNumeric(n) {
return isFinite(+n); // Or: return isFinite(Number(n));
}
现在,如果您确定n
总是已经是一个数字(不是布尔值或字符串或其他内容),那么是的,您可以跳过解析阶段。
答案 2 :(得分:0)
唔,你不能使用是有限的,因为只有有限数才会返回真。
例如isFinite(1/0)
返回false。
Infinity是一个数字,它不是有限的。
我建议查看大型图书馆如何做到这一点:
<强> Jquery的强>
isNumeric: function( obj ) {
// parseFloat NaNs numeric-cast false positives (null|true|false|"")
// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
// subtraction forces infinities to NaN
return obj - parseFloat( obj ) >= 0;
}
<强> Underscore.js 强>
function isNumber(obj) {
return toString.call(obj) == '[object Number]';
}