2016-10-06 2 views
2

Я задаюсь вопросом, почему следующие работы:Javascript сравнения номер строки

oldversion = "1.3.52"; 
newversion = "1.3.54"; 

if (newversion > oldversion) { 
    console.log('test'); 
} 

Но это не так:

if (1.3.54 > 1.3.52) { 
    console.log('test'); 
} 

Я знаю, что последний пример не будет работать, потому что они не реальные цифры , Но пока я пытаюсь выяснить, что делает javascript, когда он встречает строку с номером в ней.

Это то, что я нашел на w3:

При сравнении строки с числом, JavaScript преобразует строку в число при выполнении сравнения.

Так как же оно преобразует строку в число, и вдруг я больше не получаю Uncaught SyntaxError: Unexpected number?

+1

'1.3.54' это не число, просто как это. '1' - это число или' 1.3' - это число, но добавление дополнительных точек недопустимо. – vlaz

+0

Я заявляю в своем посте, что я это понимаю. Это не объясняет, почему мой другой пример работает. Вот что я хочу узнать. –

+1

Это просто сравнение строк. Поэтому использование этого для проверки версий было бы неправильным. – Keith

ответ

3

Вы можете использовать функцию, которая итерирует сегменты.

function checkVersion(a, b) { 
 
    var aa = a.split('.').map(Number), 
 
     bb = b.split('.').map(Number), 
 
     i, 
 
     r = 0, 
 
     l = Math.max(aa.length, bb.length); 
 

 
    for (i = 0; !r && i < l; i++) { 
 
     r = (aa[i] || 0) - (bb[i] || 0); 
 
    } 
 
    return r; 
 
} 
 

 
var oldversion = "1.3.52", 
 
    newversion = "1.3.54"; 
 

 
if (checkVersion(newversion, oldversion) > 0) { 
 
    console.log('test'); 
 
}

+0

О, мне нравится карта (номер), я никогда не думал об этом .. Теперь я собираюсь изменить мою версию. Но кредит тоже ты .. :) – Keith

1

Как уже упоминалось в комментариях, это фактически делает сравнение строк и не пытается превратить что-либо в числа.

Вы можете проверить это попробовать:

var a = "a"; 
var b = "b"; 
console.log(a>b) // gives false 

var a = "a"; 
var b = "b"; 
console.log(b>a) // gives true 
+0

Также '' 1.21 ">" 1.200 "' only _looks_ correct (потому что .200 =. 2 <.21), но если вы берете целые числа 200, то определенно больше 21. Заменяйте точку на что-нибудь, и становится очевидным '' 1z21 ">" 1z200 "' - это не проверка чисел, а каждый символ. – vlaz

0

@ решение Нины должно быть принято отвечать, так как это будет легче понять, как мне кажется. Но в любом случае ..

function versionGreaterEqual(newversion, oldversion) { 
 
    var ov = oldversion.split('.').map(Number), //credit Nina :) 
 
     nv = newversion.split('.').map(Number); 
 
    return nv.reduce(function (a,b,i){ 
 
    return a+=b>=ov[i]; 
 
    },0)===nv.length; 
 
} 
 

 
console.log(versionGreaterEqual("1.3.54", "1.3.52")); //true 
 
console.log(versionGreaterEqual("1.3.54", "1.13.52")); //false

1

Как вы говорите, когда вы сравните число и строку, строка преобразуется в число. Однако, если строка содержит недопустимое число, результатом будет NaN. Это смешно из-за того, что:

NaN > 15 === false 
NaN < 15 === false 

Итак:

"1.3.52" > 1.4 === false 
"1.3.52" < 1.4 === false 

Очевидно (и, как вы сказали в своем посте), сравнивая 1.3.52 с 1.3.54 выбросит исключение, потому что они 'недопустимые числа.

Почему «1.3.52» интерпретируется больше, чем «1.12.10»?

Строки сравниваются с использованием кода в кодировке Unicode. Например, «Банана» приходит перед «вишней». «9» больше, чем «80», но потому, что «80» приходит до «9» в порядке Юникод. Таким образом, «1.3.52» интерпретируется как больше, чем «1.12.10».

Простой способ найти порядок между строками и не обманом использовать сортировку. Например, ["1.3.52", "1.12.10", "1.11.0.0.0"].sort()

+0

Спасибо, что очень полезно, используя sort(), чтобы очистить туман и покажите мне, что именно происходит. Как порядок юникодов работает с точками между ними? Содержит ли он все символы юникода внутри строки? –

+0

Я не думаю, что это добавляет их, чтобы решить заказ. Дело в том, что порядок символов в строке важен. Например, «2»> «12» === true (первый символ имеет значение). Я думаю, что это относится к точкам, как к другому персонажу. Надеюсь, поможет. – acontell

+0

Надеюсь, кто-то может прояснить это, это действительно так, но спасибо за помощь. Действительно ценю это! –

 Смежные вопросы

  • Нет связанных вопросов^_^