Почему 12:34 ‹123: 45 равно false?

Может кто-нибудь объяснить, почему условие '12:34' < '123:45' равно false?

console.log('12:34' < '123:45' ? 'true' : 'false')


person Rodrigo Guariento    schedule 03.08.2020    source источник
comment
(Почему) вы ожидаете, что это будет правдой?   -  person B001ᛦ    schedule 04.08.2020
comment
Используйте скорее '12:34'.localeCompare('123:45'), что даст вам -1 в качестве результата, что означает, что "12:34" идет до "123:45". MDN localeCompare   -  person Roko C. Buljan    schedule 04.08.2020


Ответы (4)


Из-за кода ASCII 3 и :. Мы знаем, что сравнение строк будет производиться по правилу словаря. Следовательно, поскольку первое различие находится в третьем месте двух строк, код ASCII 3 и : будет определять результат сравнения. Поскольку код ASCII : больше 3, в результате вы видите ложь. См. Их код ASCII ниже.

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

person OmG    schedule 03.08.2020

В строке есть не только числа, поэтому она будет сравниваться со строкой, а не с числом. Когда строка сравнивается, она начинает оценивать одну за другой.

Итак, в вашем случае третий символ - это : и 3. Теперь сравнение обоих приведет к тому, что false - 3 больше, чем : (NaN), при условии, если он сравнивается по Number на шаге. Фактически, JavaScript сравнивает его с charCodeAt, как упоминалось в другом ответе. В любом случае это false. Как вы ожидаете, что это будет правдой?

person Community    schedule 03.08.2020
comment
«В строке не только числа, поэтому она будет сравниваться со строкой, а не числом» - никакая строка не сравнивается как число, независимо от того, какие символы она содержит. - person Sebastian Simon; 04.08.2020

Я нашел на этом page, что если вы сравниваете две строки, JavaScript сравнивает числовые коды символов в строке один за другим.

Строки будут равны до второго индекса, где у одного есть :, а у другого 3. Сравните два с charCodeAt().

'12:34'.charCodeAt(2) // => 58

'123:34'.charCodeAt(2) // => 51

Поскольку : имеет более крупный код символа, эта строка считается более крупной, чем другая.

person Jason Melton    schedule 03.08.2020

Код ASCII "3" - 51, ":" - 58.

Когда : стоит перед 3, JavaScript предполагает, что вы говорите 58 < 51, то есть false.

person Fritzdultimate    schedule 03.08.2020