我正在使用isNan函数检查输入的值是否为数字:
if(isNaN(num)) {
alert('I am not a number');
}
else {
//
}但是,如果输入的值是"5748hh“,就像数字一样可以理解,并返回false。怎么啦?
发布于 2012-01-19 16:44:59
来自Mozilla MDN
如果isNaN函数的参数不是数字,则首先将该值强制转换为数字。然后测试结果值以确定它是否为NaN。因此,对于当强制转换为数字类型时产生有效的非NaN数值的非数字(特别是空字符串和布尔原语,它们在强制时给出数值0或1),"false“返回值可能是意想不到的;例如,空字符串肯定是”不是数字“。造成混淆的原因是,术语“不是数字”对表示为IEEE-794浮点值的数字有特定的含义。这个函数应该被解释为回答这个问题,“当这个值被强制转换为一个数值时,它是不是一个IEEE-794 'Not A Number‘值?”
所以alert(isNaN('45345ll'))返回true,因为它的值强制不同于parseInt/parseFloat转换。
例如:
var num = false;
console.log(isNaN(num)); /* return false because the coerced value is 0 but */
console.log(parseInt(num, 10)); /* return isNaN */可能由于if语句中缺少paren而得到意外的值
发布于 2012-01-19 16:40:12
您必须先尝试对其进行解析:
if(isNaN(parseInt(num, 10))) {根据documentation的说法
从isNaN函数规范的最早版本开始,它对非数字参数的行为就一直令人困惑。当isNaN函数的参数不是数字时,首先将该值强制转换为数字。然后测试结果值以确定它是否为NaN。因此,对于非数字,当强制为numeric类型时,会导致有效的非NaN数值(特别是空字符串和布尔原语,它们在强制时会给出0或1的数值)
与parseInt()不同,强制将其转换为数字将不会像5748hh那样为字符串生成数字,因此会出现您所看到的行为。
发布于 2012-01-19 16:42:38
如果解析以数字开头的字符串,它将成功解析为数字,而忽略字符串的其余部分。例如,parseInt('56sadfh', 10)将解析成56。如果你想防止这种情况,你应该使用正则表达式来检查输入。例如:
if (!num.match(/[0-9]+/)) {
alert("not a number");
}https://stackoverflow.com/questions/8923119
复制相似问题