isNaN没有捕捉字母

gen*_* b. -1 javascript string numbers nan

我有JS代码来验证邮政编码:10个数字字符,在第6个位置有一个短划线(例如,12345-6789).我验证这两个部分都是数字使用!isNaN.

if (valSize == 10) {
    var numVal1 = new Number(newVal.substring(0, 4));
    var numVal2 = new Number(newVal.substring(6, 9));
    if (newVal.charAt(5) == '-' && !isNaN(numVal1) && !isNaN(numVal2)) {
        return newVal;
    }
}
throw "Incorrect format";
Run Code Online (Sandbox Code Playgroud)

这主要是有效的,但由于某种原因,以下值会通过,并且不会返回错误:

12345-678a
Run Code Online (Sandbox Code Playgroud)

为什么!在这种情况下允许IsNaN(substring(6,9))通过?

Sal*_*n A 7

String.substring 功能签名是:

str.substring(indexA[, indexB])
Run Code Online (Sandbox Code Playgroud)

指数A

一个介于0和字符串长度之间的整数,指定要包含在返回的子字符串中的第一个字符的字符串的偏移量.

indexB

可选的.一个介于0和字符串长度之间的整数,它指定第一个字符的字符串中的偏移量,包括在返回的子字符串中.

所以你有了:

"12345-678a".substring(0,4) // 1234
"12345-678a".substring(6,9) // 678
Run Code Online (Sandbox Code Playgroud)

所以要么纠正指数:

"12345-678a".substring(0,5) // 12345
"12345-678a".substring(6)   // 678a
Run Code Online (Sandbox Code Playgroud)

或者使用String.substr.


或者使用正则表达式(推荐),因为您的当前代码在修复后会很乐意接受12.45-67.8,+1234--678并且12e45-6e-9.你需要做的就是:

/^\d{5}-\d{4}$/.test("12345-678a") // false
/^\d{5}-\d{4}$/.test("12.45-67.8") // false
/^\d{5}-\d{4}$/.test("12345-6789") // true
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是"12345-678a".substr(6,9)// 678a` (2认同)