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

1 javascript

想知道是否有人可以解开一些光线,因为我正在把头发拉过这个!

我已经编写了一个简单的函数来验证用户出生日期是好还是好,或者至少直到我意识到它没有按预期工作!

该函数如下所示,有2个参数,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 DOByyyyOK = false;

function validateDOB (dobNum, dmy) {
  // Set Regexp based on dmy var.
    if (dmy.length == 2) var reg = /^([0-9]{1,2})$/;
      else  var reg = /^([0-9]{4})$/;
    var numOK = reg.test(dobNum);
    alert("NumOK: "+numOK); //test

  // If dobNum value passes regExp test then convert  it to an integer
    if (numOK) {
      var numVar = parseInt(dobNum); 
      //var numVar = dobNum;
      alert("NumVar: "+numVar); //test
    }
    alert("dmy: "+dmy); //test

    switch (dmy) {
      case "dd":
        if (numOK && numVar <= 31 && numVar > 0) DOBddOK = true;
        else DOBddOK = false;
        break;
      case "mm":
        if (numOK && numVar <= 12 && numVar > 0) DOBmmOK = true;
        else DOBmmOK = false;
        break;
      case "yyyy":
        var d = new Date();
        d = d.getFullYear();
        if (numOK && numVar <= (d-18) && numVar >= (d-80)) DOByyyyOK = true;
        else DOByyyyOK = false;
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 12

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

始终建议使用radix参数:

parseInt('08', 10); // 8
parseInt('09', 10); // 9
Run Code Online (Sandbox Code Playgroud)

这导致了许多问题,在新版本的语言标准ECMAScript 5中,隐式八进制检测已从parseInt算法中删除.但ES5尚未得到完全支持.

还有其他方法可以在JavaScript中将String转换为Number,但不会出现此问题,例如:

一元正操作:

+'08'; // 8
Run Code Online (Sandbox Code Playgroud)

Number构造函数被称为函数:

Number('08'); // 8
Run Code Online (Sandbox Code Playgroud)

在我看来parseInt,我所描述的后两种方式具有(巧妙地)不同的语义.

前者显然正在解析,例如:

parseInt('12px');    // 12
parseInt('10yo');    // 10
parseInt('1111', 2); // 15
Run Code Online (Sandbox Code Playgroud)

最后两种方法是进行String to Number 类型转换.