Javascript parseInt()返回不正确的值;DOB验证

Javascript parseInt()返回不正确的值;DOB验证,javascript,Javascript,想知道是否有人能在我为这件事拔头发的时候给我点颜色看看 我已经编写了一个简单的函数来验证用户的出生日期,这一切都很好,或者至少在我意识到它没有按预期工作之前是这样 如下所示,该函数采用两个参数:dobNum(输入字段的值)和dmy(接收“dd”、“mm”或“yyyy”的开关变量)。使用输入字段的值按如下方式调用函数,因此不应存在任何基于对象的问题: onblur=“validateDOB(this.value,'mm') 我花了很长时间试图弄清这一点,但是parseInt()语句似乎有问题。 在

想知道是否有人能在我为这件事拔头发的时候给我点颜色看看

我已经编写了一个简单的函数来验证用户的出生日期,这一切都很好,或者至少在我意识到它没有按预期工作之前是这样

如下所示,该函数采用两个参数:dobNum(输入字段的值)和dmy(接收“dd”、“mm”或“yyyy”的开关变量)。使用输入字段的值按如下方式调用函数,因此不应存在任何基于对象的问题:

onblur=“validateDOB(this.value,'mm')

我花了很长时间试图弄清这一点,但是parseInt()语句似乎有问题。 在你通过08分(零分,八分)或09分(零分,九分)之前的几天和几个月内,这都可以正常工作。这里,parseInt()的结果分别返回为0,而不是8或9。
但这只是08和09的一个问题,将数字01传递到07会像预期的那样返回1到7。
类似地,当向函数传递一位数(1到9)时,parseInt()将以整数形式返回相应的值

真的很难理解这一点。相反地,完全删除parseInt语句似乎是可行的,但是这会将dobNum值保留为字符串,我觉得这不是一个特别好的做法

有人能解释一下吗?(这个问题在firefox和IE中都会出现) 非常感谢,, SMc

var-DOBddOK=false;
var-DOBmmOK=false;
var dobyyyyk=false;
函数validateDOB(dobNum,dmy){
//基于dmy var设置Regexp。
if(dmy.length==2)var reg=/^([0-9]{1,2})$/;
else var reg=/^([0-9]{4})$/;
var numOK=调节试验(dobNum);
警报(“NumOK:+NumOK);//测试
//如果dobNum值通过regExp测试,则将其转换为整数
国际单项体育联合会(新墨西哥){
var numVar=parseInt(dobNum);
//var numVar=dobNum;
警报(“NumVar:+NumVar);//测试
}
警报(“dmy:+dmy);//测试
开关(dmy){
案例“dd”:
如果(numOK&&numVar 0)DOBddOK=true;
else-DOBddOK=false;
打破
案例“mm”:
如果(numOK&&numVar 0)DOBmmOK=true;
else-DOBmmOK=false;
打破
案例“yyy”:
var d=新日期();
d=d.getFullYear();
如果(numOK&&numVar=(d-80))DOByyyyOK=true;
else-dobyyyok=false;
打破
}
}

它将前导零的字符串处理为八进制,您可以指定第二个参数,将基数指定为10


请参见

它将前导零的字符串处理为八进制,您可以指定第二个参数,将基数指定为10


请参见当
parseInt
函数在传递的字符串中找到前导零时,它将隐式地将数字解析为八进制

始终建议使用基数参数:

parseInt('08', 10); // 8
parseInt('09', 10); // 9
随着时间的推移,这已经造成了很多问题,以至于在新版本的语言标准ECMAScript 5中,隐式八进制检测已经从中删除。但是ES5还没有完全得到支持

在JavaScript中,还有其他将字符串转换为数字的方法不存在此问题,例如:

parseInt('12px');    // 12
parseInt('10yo');    // 10
parseInt('1111', 2); // 15
操作员:

+'08'; // 8
:

在我看来,
parseInt
和我所描述的后两种方式有着(微妙的)不同的语义含义

前者显然是解析,例如:

parseInt('12px');    // 12
parseInt('10yo');    // 10
parseInt('1111', 2); // 15

最后两种方法用于进行字符串到数字类型的转换。

parseInt
函数在传递的字符串中找到前导零时,它将隐式地将数字解析为八进制

始终建议使用基数参数:

parseInt('08', 10); // 8
parseInt('09', 10); // 9
随着时间的推移,这已经造成了很多问题,以至于在新版本的语言标准ECMAScript 5中,隐式八进制检测已经从中删除。但是ES5还没有完全得到支持

在JavaScript中,还有其他将字符串转换为数字的方法不存在此问题,例如:

parseInt('12px');    // 12
parseInt('10yo');    // 10
parseInt('1111', 2); // 15
操作员:

+'08'; // 8
:

在我看来,
parseInt
和我所描述的后两种方式有着(微妙的)不同的语义含义

前者显然是解析,例如:

parseInt('12px');    // 12
parseInt('10yo');    // 10
parseInt('1111', 2); // 15

最后两种方法是进行字符串到数字类型的转换。

尝试使用基数
parseInt(dobNum,10)
解析以10为基数的整数尝试使用基数
parseInt(dobNum,10)
解析以10为基数的整数

哈哈,我喜欢人们如何将其称为bug,但它有明确的文档记录>\u哈哈,我喜欢人们称之为bug的方式,但它的文档记录得很清楚>\u Simple demo.Simple demo。