在JavaScript中区分0和空字符串的最安全的方法是什么?

时间:2013-09-27 10:30:57

标签: javascript

从用户输入,我收到一个必须包含数字的字符串。 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处理相同(?!)我不知道我的代码可能暴露给哪些其他漏洞。

6 个答案:

答案 0 :(得分:1)

我会选择===,尝试如下:0 === "" // false

关于它们和类型转换的区别如下:
Q: Does it matter which equals operator (== vs ===) I use in JavaScript comparisons?

答案 1 :(得分:1)

我会做这样的事情:

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

这似乎是最简单和最正确的答案,因为parseInt only returns an integer or NaN

答案 2 :(得分:0)

  

这甚至是一个解决方案吗?有什么方法可以成为一个数字以外的东西吗?

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

  

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

您可以使用simple regex来测试:

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

对于仅包含(和至少一个)数字的字符串,它将产生true,而对于其他任何数字(非数字和空字符串),它将产生false

答案 3 :(得分:0)

创建自己的测试,每次尝试一百万次,并检索所需的时间。

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

答案 4 :(得分: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);
}

答案 5 :(得分:0)

0 == "" // true

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

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

你应该使用===,其中

0 === "" // false

没有类型强制。