【问题标题】:Javascript string/integer comparisonsJavascript字符串/整数比较
【发布时间】:2011-04-12 03:34:05
【问题描述】:

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

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

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

【问题讨论】:

标签: javascript html


【解决方案1】:

使用parseInt将字符串解析为整数:

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

【讨论】:

  • 太棒了。是否还有一种方法可以首先检查该值是否为 int,这样我就可以尽量避免最终出现更多错误...
  • @Ronan:您实际上可以将 int 作为第一个参数传递给 parseInt。 parseInt 将它的第一个参数转换为一个字符串,如果它还不是一个,然后解析它。但是,如果您确实需要检查某个内容是否为 int,通常可以使用 typeof 123 并检查 "number" 的结果。但是,如果您传入new Number(123),这可能会出现问题,在这种情况下它将返回"object",但这并不常见。
  • @Ronan:哦,您也可以检查constructor 属性,并将其与Number 进行比较。这似乎在这两种情况下都有效。
  • 如果参数是一个数字字符串,那么parseFloat(param) == param
【解决方案2】:

检查字符串是否为整数与比较一个大于或小于另一个是分开的。您应该始终将数字与数字和字符串与字符串进行比较,因为处理混合类型的算法不容易记住。

'00100' < '1' // true

因为它们都是字符串,所以只有 '00100' 的第一个零与 '1' 进行比较,并且因为它的 charCode 较低,它的计算结果为较低。

但是:

'00100' < 1 // false

由于右轴是一个数字,所以左轴在比较之前转换为数字。

一个简单的整数检查是:

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() 因为它会截断浮点数以使它们看起来像整数,所以以下所有内容都是“相等的”:

parseInt(2.9) == parseInt('002',10) == parseInt('2wewe')

等等。

一旦将数字作为整数进行测试,您可以使用一元 + 运算符将它们转换为比较中的数字:

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

【讨论】:

  • 一元 + 运算符是快速同质化的救星 - 感谢您的提示。
【解决方案3】:

在不使用 parseInt 的情况下将数字与字符串等价物进行比较

console.log(Number('2') > Number('10'));
console.log( ('2'/1) > ('10'/1) );

var item = { id: 998 }, id = '998';
var isEqual = (item.id.toString() === id.toString());
isEqual;

【讨论】:

  • 这个方法不管数字多大都更好:) 谢谢
  • 您更喜欢哪个? .toString(),Number 构造函数,还是算术?为什么?
  • 这效果最好。您不需要强制转换任何内容 + 以确保所有内容都已保存,检查您要比较的值是否为 undefined / null(如果您确实保存了未定义/空值并比较两个未定义/空值)。
【解决方案4】:

使用parseInt 并进行如下比较:

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

【讨论】:

    【解决方案5】:

    当我们比较两个字符串时,请务必记住。 比较是在字符的基础上进行的。 所以 '2' > '12' 是真的,因为比较会发生在 '2' > '1' 并且按字母顺序 '2' 总是大于 '1' 作为 unicode。 所以它会成真。 我希望这会有所帮助。

    【讨论】:

      【解决方案6】:

      您也可以使用Number() 函数,因为它将对象参数转换为表示对象值的数字。

      例如:javascript:alert( Number("2") &gt; Number("10"))

      【讨论】:

        【解决方案7】:

        答案很简单。只需将字符串除以 1。 例子:

        "2" > "10"   - true
        

        但是

        "2"/1 > "10"/1 - false
        

        你也可以检查字符串值是否真的是数字:

        !isNaN("1"/1) - true (number)
        !isNaN("1a"/1) - false (string)
        !isNaN("01"/1) - true (number)
        !isNaN(" 1"/1) - true (number)
        !isNaN(" 1abc"/1) - false (string)
        

        但是

        !isNaN(""/1) - true (but string)
        

        解决方案

        number !== "" && !isNaN(number/1)
        

        【讨论】:

          【解决方案8】:

          alert() 想要显示一个字符串,所以它会将 "2">"10" 解释为一个字符串。

          使用以下内容:

          var greater = parseInt("2") > parseInt("10");
          alert("Is greater than? " + greater);
          
          var less = parseInt("2") < parseInt("10");
          alert("Is less than? " + less);
          

          【讨论】:

            【解决方案9】:

            + 运算符会将字符串强制转换为数字。

            console.log( +"2" &gt; +"10" )

            【讨论】:

              猜你喜欢
              • 2013-09-03
              • 2015-10-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-06-21
              • 2012-02-09
              • 2013-05-30
              相关资源
              最近更新 更多