0

从用户输入中,我收到一个必须包含数字的字符串。0和空字符串必须区别对待。

我做了这个简短的案例研究

0 == "" // true
parseInt(0) == "" // true
parseInt("") // NaN
parseInt("") == "NaN" // false
parseInt("") == NaN // false
typeof parseInt("") // "number"

通过一些额外的研究,我提出了这个解决方案(考虑uInput到用户输入)

function userInput(uInput){
var n = parseInt(uInput);
if (isNan(n))
// empty string
else
// 0 or number
}

看起来它能够在 Google Chrome 中正确区分 0 和空字符串。

我想知道的是:

  • 这是最好/最有效的解决方案吗?
  • 这个解决方案在任何浏览器中都兼容吗?
  • 这甚至是一个解决方案吗?有没有什么办法n可以变成数字以外的东西(考虑uInput可以是任何类型的字符串)?

我不会问这个,但由于空字符串和 0 被视为相同(?!)我不知道我的代码可能暴露在哪些其他漏洞中。

4

6 回答 6

1

我会做这样的事情:

var nmbr = parseInt(uInput, 10);
if (!isNaN(nmbr)) {
    // Yay, valid input!
} else {
    // Ups, weird input...
}

这似乎是最简单和最正确的答案,因为parseInt只返回一个整数或NaN

于 2013-09-27T10:37:26.367 回答
1

我会去===,试试看:0 === ""//假

它们和类型转换的区别如下:
问:我在 JavaScript 比较中使用哪个等于运算符(== vs ===)有关系吗?

于 2013-09-27T10:34:07.760 回答
0

尝试这个:

function validate(uInput){
    var regEx = /^[1-9]{1}[\d]*$/;
    if (regEx.test(uInput))
        alert(uInput + " is a valid number.");
    else
        alert(uInput + " is not valid number.");

    var validNumber = parseInt(uInput);
}
于 2013-09-27T10:47:54.660 回答
0

创建您自己的测试,您确实喜欢为每个测试进行一百万次尝试并检索它所花费的时间。

对于浏览器的兼容性,我想简单的操作应该是一样的。

于 2013-09-27T10:36:52.820 回答
0

这甚至是一个解决方案吗?有没有办法 n 可以变成数字以外的东西?

是的。parseInt解析时只考虑字符串的第一个整数部分。它忽略其余部分,因此"12.34 oops"仍将验证为12.

我收到一个必须包含数字的字符串

您可以使用一个简单的正则表达式来测试:

/^\d+$/.test(uInput)

它将true为仅由(和至少一个)数字组成的字符串以及false其他任何内容(非数字和空字符串)产生。

于 2013-09-27T10:35:45.283 回答
0
0 == "" // true

因为 == 首先进行类型强制:

0 == false, "" == false so false == false.

你应该使用 ===,其中

0 === "" // false

没有类型强制。

于 2013-09-27T11:20:34.553 回答