我在客户端将一些参数存储在HTML中,然后需要将它们作为整数进行比较。不幸的是,我遇到了一个我无法解释的严重错误。bug似乎是我的JS将参数作为字符串而不是整数读取,导致我的整数比较失败。
我生成了一个错误的小例子,我也无法解释。运行时,以下返回“true”:
javascript:alert("2">"10")
使用parseint
将字符串解析为整数:
javascript:alert(parseInt("2", 10)>parseInt("10", 10))
检查字符串是否为整数与比较一个大于或小于另一个是分开的。您应该始终将number与number以及string与string进行比较,作为处理不易记忆的混合类型的算法。
'00100' < '1' // true
因为它们都是字符串,所以只有'00100'的第一个0与'1'相比较,因为它的charCode较低,所以它的计算值较低。
然而:
'00100' < 1 // false
由于RHS是一个数字,因此在比较之前将LHS转换为数字。
一个简单的整数检查是:
function isInt(n) {
return /^[+-]?\d+$/.test(n);
}
如果n是数字或整数也没关系,它会在测试前被转换为字符串。
如果你真的关心性能,那么:
var isInt = (function() {
var re = /^[+-]?\d+$/;
return function(n) {
return re.test(n);
}
}());
注意像1.0这样的数字将返回false。如果您也想将这类数字作为整数进行计数,那么:
var isInt = (function() {
var re = /^[+-]?\d+$/;
var re2 = /\.0+$/;
return function(n) {
return re.test((''+ n).replace(re2,''));
}
}());
一旦该测试通过,转换为用于比较的数字可以使用许多方法。我不喜欢parseInt(),因为它会截断浮点,使它们看起来像int,所以下面的所有内容都将是“相等的”:
parseInt(2.9) == parseInt('002',10) == parseInt('2wewe')
等等。
一旦数字被测试为整数,您就可以在比较中使用unary+运算符将其转换为数字:
if (isInt(a) && isInt(b)) {
if (+a < +b) {
// a and b are integers and a is less than b
}
}
其他方法有:
Number(a); // liked by some because it's clear what is happening
a * 1 // Not really obvious but it works, I don't like it