【问题标题】:Why is `"12:34" < "123:45"` equal to `false`? [duplicate]为什么`"12:34" <"123:45"`等于`false`? [复制]
【发布时间】:2020-11-23 23:41:02
【问题描述】:

有人能解释一下为什么'12:34' &lt; '123:45'false 吗?

console.log('12:34' &lt; '123:45' ? 'true' : 'false')

【问题讨论】:

  • (为什么)你认为它是真的?
  • 使用而不是'12:34'.localeCompare('123:45'),这将给你-1,这意味着"12:34"之前 "123:45"MDN localeCompare

标签: javascript string comparison lexicographic


【解决方案1】:

因为3:的ASCII码。我们知道字符串之间的比较将由字典规则完成。因此,由于第一个区别在两个字符串的第三个位置,3: 的 ASCII 码将决定比较的结果。由于: 的ASCII 码大于3,因此您会看到错误的结果。它们的 ASCII 码见下文。

console.log(":".charCodeAt(0));
console.log("3".charCodeAt(0));

【讨论】:

    【解决方案2】:

    字符串中不仅有数字,因此它将与字符串而不是数字进行比较。当字符串被比较时,它开始一个一个地计算。

    因此,在您的情况下,第三个字符是 :3。现在,比较两者将导致 false - 3 大于 : (NaN) 假设如果它在步骤中按数字进行比较。事实上,JavaScript 将其与另一个答案中提到的 charCodeAt 进行了比较。无论哪种方式,它都是false。你怎么认为它是真的?

    【讨论】:

    • “字符串中不仅有数字,因此它会与 String 而不是 Number 进行比较” — 无论字符串包含什么字符,都不会像数字那样比较字符串。跨度>
    【解决方案3】:

    我在page 上发现,如果您要比较两个字符串,JavaScript 会“逐一比较字符串中的字符代码。”

    字符串将相等,直到第二个索引有一个:,另一个有一个3。将两者与charCodeAt() 进行比较。

    '12:34'.charCodeAt(2) // =&gt; 58

    '123:34'.charCodeAt(2) // =&gt; 51

    因为: 的字符代码较大,所以该字符串被认为比另一个字符串大。

    【讨论】:

      【解决方案4】:

      "3"的ASCII码是51":"的ASCII码是58

      : 出现在3 之前时,JavaScript 会假定您说的是58 &lt; 51,即false

      【讨论】:

        猜你喜欢
        • 2018-10-17
        • 2018-09-03
        • 1970-01-01
        • 2018-09-29
        • 1970-01-01
        • 1970-01-01
        • 2021-07-31
        • 2010-12-22
        • 1970-01-01
        相关资源
        最近更新 更多