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