想知道是否有人可以解开一些光线,因为我正在把头发拉过这个!
我已经编写了一个简单的函数来验证用户出生日期是好还是好,或者至少直到我意识到它没有按预期工作!
该函数如下所示,有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('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 类型转换.
| 归档时间: |
|
| 查看次数: |
2047 次 |
| 最近记录: |