我只是想评估输入是否是数字,并且认为isNaN
是最好的方法。但是,这会导致不可靠的结果。例如,使用以下方法:
function isNumerical(value) {
var isNum = !isNaN(value);
return isNum ? "<mark>numerical</mark>" : "not numerical";
}
关于这些值:
isNumerical(123)); // => numerical
isNumerical("123")); // => numerical
isNumerical(null)); // => numerical
isNumerical(false)); // => numerical
isNumerical(true)); // => numerical
isNumerical()); // => not numerical
显示在这个小提琴中:http://jsfiddle.net/4nm7r/1
为什么isNaN
始终不适合我?
答案 0 :(得分:5)
isNaN
会返回true
(或者如果无法将其转换为数字,那么null
,true
和false
将转换为0
),否则返回false
。在您的情况下,您必须在函数调用之前删除!
!
很容易理解脚本的行为。 isNaN
只是检查一个值是否可以转换为int。要做到这一点,你只需将它乘以或除以1,或减去或加0.在你的情况下,如果你这样做,在你的函数alert(value * 1);
内,你会发现所有那些传递的值将被替换为一个数字(0,1,123),undefined
除外,其数值为NaN
。
你无法将任何值与NaN
进行比较,因为它永远不会返回false(甚至是NaN === NaN
),我认为这是因为NaN是动态生成的...但我不确定。< / p>
无论如何,只需执行此操作即可修复代码:
function isNumerical(value) {
var isNum = !isNaN(value / 1); //this will force the conversion to NaN or a number
return isNum ? "<mark>numerical</mark>" : "not numerical";
}
答案 1 :(得分:1)
如果!isNaN()
返回true,您的三元语句是向后的,您想说"numerical"
return isNum ? "not numerical" : "<mark>numerical</mark>";
应该是:
return isNum ? "<mark>numerical</mark>" : "not numerical";
请参阅更新的小提琴:
答案 2 :(得分:1)
现在您已经修复了其他答案中指出的反向逻辑,使用parseFloat
来消除true
,false
和null
的误报:< / p>
var isNum = !isNaN(parseFloat(value));
请记住parseFloat
的以下类型的输出:
parseFloat("200$"); // 200
parseFloat("200,100"); // 200
parseFloat("200 foo"); // 200
parseFloat("$200"); // NaN
(即,如果字符串以数字开头,parseFloat将提取它可以找到的第一个数字部分)
答案 3 :(得分:1)
我建议你使用额外的支票:
function isNumerical(value) {
var isNum = !isNaN(value) && value !== null && value !== undefined;
return isNum ? "<mark>numerical</mark>" : "not numerical";
}
如果您希望将123
这样的字符串视为不是数字,那么您应该再添加一个支票:
var isNum = !isNaN(value) && value !== null && value !== undefined && (typeof value === 'number');