提问者:小点点

Javascript字符串/整数比较


我在客户端将一些参数存储在HTML中,然后需要将它们作为整数进行比较。不幸的是,我遇到了一个我无法解释的严重错误。bug似乎是我的JS将参数作为字符串而不是整数读取,导致我的整数比较失败。

我生成了一个错误的小例子,我也无法解释。运行时,以下返回“true”:

javascript:alert("2">"10")

共2个答案

匿名用户

使用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